Intereting Posts
Доступный почтовый ящик Office356 с PHP Превращение ошибок запроса в Исключения в MySQLi Извлечение определенных значений из строки в виде отдельных переменных Определите, является ли 10-значная строка действительной. Amazon ASIN PHPExcel – установить ячейки как строку при загрузке из массива как получить доступ к командной строке для xampp на окнах Список функций Notepad ++ PHP не работает, если я не закрыл тег PHP MySQLi DATE_FORMAT не работает вообще Перенаправить весь трафик на index.php с помощью mod_rewrite PHPDoc: документирование функции с переменным числом аргументов Являются ли @imagecreatefromjpeg и imagejpeg () эффективными для предотвращения загрузки пользователями изображений с вредоносным кодом php внутри них? Не удается отправить электронную почту на адреса hotmail Как использовать ACL для фильтрации списка объектов домена в соответствии с разрешениями определенного пользователя (например, EDIT)? Использование $ this, если не в объектном контексте Загрузить изображение с помощью Ajax и PHP

Каковы веские причины использования статических методов в PHP?

Есть ли у кого-нибудь хорошие примеры использования статических методов вместо динамических?

Синглтон:

class SingletonClass { private static $instance; private function __construct() { } public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public static function init() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // other public, dynamic methods for singleton } $singleton = SingletonClass::init(); 

Отслеживать количество экземпляров:

 class CountMe { public static $instances = 0; public function __construct() { CountMe::$instances++; } public function __destruct() { CountMe::$instances--; } } $a = new CountMe(); $b = new CountMe(); echo CountMe::$instances; // outputs 2 

Когда вам не нужен доступ к членам экземпляра.

Соединение с базой данных будет полезно использовать для статической функции. Вам не нужен прямой доступ ко всему объекту БД, вам просто нужен доступ к ресурсу подключения. Таким образом, вы можете позвонить

  $connection = new DatabaseConnection(); StaticClass::setDatabase($connection); $result = StaticClass::getDatabaseConnection()->query(); 

Но если вам нужен доступ к классу для хранения позже или несколько экземпляров одного и того же объекта, вы не захотите статически ставить.

Ваш класс также теперь живет в глобальной области, поэтому вы можете получить к нему доступ из любого класса в любой области, где бы вы ни находились в вашей кодовой базе.

 function getUsers() { $users = StaticClass::getDatabaseConnection()->query('SELECT * FROM users'); } 

В менее кодово-ориентированном характере, вот как я определяю статические методы (я буду использовать банк в качестве примера): Если у вас был класс банка и вы хотели бы открыть новый банк, вы бы использовали:

 $b = new Bank; 

Предположим, вы хотели добавить нового сотрудника в этот банк. Просто позвоните:

 $b->addEmployee( 'Person' ); 

Поскольку вы применяете действие к банку, который вы создали, а не к компании, которой принадлежит банк в целом, вы используете метод участника. Теперь предположим, что компания торгует некоторыми активами и зарабатывает деньги. Чтобы обновить свои общие деньги, вы бы назвали это:

 Bank::addToCompanyBalance( 1000000 ); 

Обратите внимание, что, поскольку действие было применено не только к банку, который мы создали, мы вместо этого использовали статический метод.

Конечно, этот пример очень упрощен, но мне нравится аналогия. В более программном смысле статические элементы хороши для:

Одиночки

 class Singleton private static $instance; private function __construct() {} private function __clone() {} public static function getInstance() { if( !isset( self::$instance ) ) self::$instance = new IamOne; return( self::$instance ); } } 

Создание классов, которые могут
Ex. Класс обработчика файлов может не всегда создавать новый объект (скажем, переданный файл не существует или не может быть открыт).

С абстрактными классами
Некоторые классы могут не иметь экземпляров (например, маршрутизатор, который интерпретирует запрос пользователя). Однако абстрактные классы можно назвать статически и поэтому могут использовать статические методы.

Пример. Используйте статические методы для создания экземпляров объекта, которые могут, возможно, принимать разные аргументы.

 Class DBConnection { public static function createFromConfiguration(Configuration $config) { $conn = new DBConnection(); $conn->setDsn($config->getDBDsn()); $conn->setUser($config->getDBUser()); $conn->setPassword($config->getDBPass()); return $conn; } public static function newConnection($dsn, $user, $password) { $conn = new DBConnection(); $conn->setDsn($dsn); $conn->setUser($user); $conn->setPassword($password); return $conn; } }