Intereting Posts
Instagram Невозможно достичь URL-адреса обратного вызова Частичный черный фон, когда водяной знак PNG-изображения с GD PHP Кодовые кодировки UTF-8 json_encode () Календарь, поддерживающий праздники Чтение данных сеанса PHP в node.js Есть ли у вас проверки здоровья в вашем веб-приложении или на веб-сайте? Ошибка Google Recaptcha, вход в систему без завершения головоломки, но показывает тик Каковы плюсы и минусы определения класса Controller через URL-адрес или наличие сценария для каждого контроллера? Magento – атрибут товара / заказа товара / товара на основе ввода пользователем Как добавить список выбора в форме контакта php Как сохранить постоянный скрипт PHP? Почему точка с запятой необязательна в последнем утверждении в php? Чтение файлов mp4 с помощью PHP Проблема с загрузкой файла dropzone.js Невозможно запросить разрешение на использование Facebook Login API «publish_actions» даже для основного администратора

В чем разница между self :: $ bar и static :: $ bar в PHP?

Возможный дубликат:
Новое я против нового статического

В чем разница между использованием self и static в приведенном ниже примере?

 class Foo { protected static $bar = 1234; public static function instance() { echo self::$bar; echo "\n"; echo static::$bar; } } Foo::instance(); 

производит

 1234 1234 

Когда вы используете self для ссылки на члена класса, вы имеете в виду класс, в котором вы используете ключевое слово. В этом случае ваш класс Foo определяет защищенное статическое свойство $bar . Когда вы используете self в классе Foo для ссылки на свойство, вы ссылаетесь на тот же класс.

Поэтому, если вы попытались использовать self::$bar другом месте вашего класса Foo но у вас был класс Bar с другим значением для свойства, он использовал бы Foo::$bar вместо Bar::$bar , что может и не быть что вы намерены:

 class Foo { protected static $bar = 1234; } class Bar extends Foo { protected static $bar = 4321; } 

Когда вы используете static , вы вызываете функцию, называемую поздними статическими привязками (введенную в PHP 5.3).

В приведенном выше сценарии использование static вместо self приведет к использованию Bar::$bar вместо Foo::$bar , потому что тогда интерпретатор учитывает повторную декларацию в классе Bar .

Обычно вы используете поздние статические привязки для методов или даже самого класса, а не свойства, поскольку вы не часто обновляете свойства в подклассах; пример использования static ключевого слова для вызова конструктора с поздними связями можно найти в этом связанном вопросе: New self vs. new static

Тем не менее, это не исключает использования static свойств и свойств.

 self:- refers to the same class whose method the new operation takes place in. static:- in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on. 

В следующем примере B наследует оба метода из A. self, привязан к A, потому что он определен в реализации A первого метода, тогда как static привязан к вызываемому классу (также см. Get_called_class ()).

 class A { public static function get_A() { return new self(); } public static function get_me() { return new static(); } } class B extends A {} echo get_class(B::get_A()); // A echo get_class(B::get_me()); // B echo get_class(A::get_me()); // A