Есть ли у кого-нибудь хорошие примеры использования статических методов вместо динамических?
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; } }