2013-11-17 5 views
2

Я просто спросил this question about the self:: keyword и не знал, что существует ключевое слово static::.PHP: Когда вам понадобится ключевое слово self ::?

Мне кажется, что вы можете использовать ClassName::, если вам нужно явно ссылаться на конкретный класс, и в противном случае вы бы хотели, чтобы self:: означал класс, называемый методом. Я пытаюсь придумать пример того, когда вам понадобится self::, где вы не могли бы просто использовать ClassName::.

Не могли бы вы заменить все вхождения self:: на ClassName::, где ClassName - это имя класса класса, в котором оно находится? Не то, что было бы лучше, или даже эквивалент семантически, но более функционально говоря ...

+0

Как вы говорите, 'self ::' ссылается на класс, метод которого находится непосредственно, 'ClassName ::', вероятно, менее эффективный способ сделать это. Я думаю, это будет похоже на привязку изображений на вашем собственном сервере через прокси –

+0

[Этот вопрос] (http://stackoverflow.com/questions/4718808/php-can-static-replace-self?rq=1) вид адресов вопрос о том, почему вы будете использовать 'static', но я все еще ищу, почему вам нужно' self'. –

+0

Единственное (?) «Полезное» использование для него - это когда вы обращаетесь к константам класса. Во всех остальных случаях это признак того, что вы должны делать что-то неправильно. PS: oooops, это 1-летний ответ lol – zerkms

ответ

0

self вперед статические вызовы, а ClassName нет, другими словами: он решает экземпляр текущего класса.

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

Это действительно важно для поздней статической привязки, видимой в PHP 5.3 и выше, и почему было введено ключевое слово static.

+0

Что вы имеете в виду форвардные статические вызовы? Можете ли вы привести пример? –

+0

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

+0

Я бы объяснил предыдущий пример: 'self ::' НЕ пересылал статические вызовы ... 'static ::' does. Поэтому я думаю, что эта концепция запуталась. –

0

Короткий ответ: Да

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

Я думаю, что self лучше, чем ClassName, просто потому, что он продолжает работать, если вы измените имя класса на класс включения или вставьте код в новый класс.

Доказательство:

namespace Foo; 

Class B{ 
    protected static function printOut() 
    { 
     echo "Defined in Foo\B name: ".__CLASS__."\n"; 
    } 
} 

Class A extends B{ 
    public static function testClassName(){ 
     A::printOut(); 
    } 
    public static function testSelf(){ 
     self::printOut(); 
    } 
    public static function testStatic(){ 
     static::printOut(); 
    } 
} 

namespace Bar; 
use Foo\A as B; 

Class A extends B{ 
    protected static function printOut(){ 
     echo "Defined in Bar\A name: ".__CLASS__."\n"; 
    } 
} 

$a = new A(); 
$b = new B(); 
$a->testClassname(); //Defined in Foo\B name: Foo\B 
$a->testSelf();  //Defined in Foo\B name: Foo\B 
$a->testStatic();  //Defined in Bar\A name: Bar\A 
$b->testClassname(); //Defined in Foo\B name: Foo\B 
$b->testSelf();  //Defined in Foo\B name: Foo\B 
$b->testStatic();  //Defined in Foo\B name: Foo\B 

Как вы можете видеть, только время Бар \ A-> распечатке() вызывается, когда вы используете static в Foo \ A

0

я, вероятно, описать self::, чтобы игнорировать класс, который будет перезаписан или полиморфен, поскольку он всегда будет использовать родительский класс, даже если он был перезаписан.

class A{ 
    public function foo(){ 
    echo "hello Mike"; 
    } 
} 

class B extends A{ 
    public function foo(){ 
    echo "this will be ignore"; 
    } 
} 

$tryThis = new B(); 
$tryThis->foo(); 

// Above will print out 
// Hello Mike 
+0

вопрос был не «что такое self ::», но «есть ли разница между« self :: »и« ClassName :: », – Omn

Смежные вопросы