2016-05-20 4 views
1

Я хотел бы получить дочерний класс в конструкции родительского класса. Дело в том, что я нашел несколько методов PHP здесь в SO и не знаю, какой из них использовать, какой из них быстрее?PHP Получить дочернее имя класса из различий родительского класса

class Parent { 
    function __construct() { 
     echo static::class;  // Method 1 (PHP 5.5+) 
     echo get_called_class(); // Method 2 (PHP 5.3+) 
     echo get_class($this); // Method 3 (PHP 5.2+) 
    } 
} 
class Child extends Parent { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

Все эхо записи одинакового результата: Child. Но почему существует 3 разных метода для такого же результата? Какой из них лучше или более оптимизирован?

+1

Почему бы вам не запустить некоторые тесты производительности, чтобы их увидеть? –

+0

Вопрос нет ** только ** о качестве, но также почему есть 3 метода для одного и того же результата, если есть другая разница. – Carlos2W

+0

'get_class ($ this)' можно вызывать передачу в экземплярах любого объекта, включая (но не ограничиваясь) '$ this'; например $ x = new DateTime(); echo get_class ($ x); '; поэтому 'get_class()' является очень общей функцией, которая использует другие функции. –

ответ

4

Три различные версии представляют собой эволюцию обработки PHP статическими. Самый ранний номер get_class был недостаточным для обработки сценариев, где вам нужно было отличить класс от имени и класс , как определено. Here is an example

So, get_called_class был представлен в PHP 5.3 для решения неоднозначности. Это продолжалось довольно долго, и по-прежнему остается правильным выбором, но теперь у нас есть псевдоселектор ::class. Зачем?

Псевдоэлектор обеспечивает два приятных преимущества. Во-первых, он позволяет вам заменять имена классов строк с помощью проверки правил пространства имен во время компиляции. Сравните:

namespace Foo\Bar; 
class Baz { public static function hi($name) { echo "Hi, $name!"; } } 
call_user_func([ Baz::class, 'hi' ], 'bishop'); 

с:

call_user_func([ '\Foo\Bar\Baz', 'hi' ], 'bishop'); 

Если я толстый палец, что последний, опечаток его, что будет во время выполнения ошибки:

call_user_func([ '\Foo\Bar\Bza', 'hi' ], 'bishop'); // error at runtime! 

Но используя ::class псевдо Я получаю компиляция-время проверка:

call_user_func([ Bza::class, 'hi' ], 'bishop'); // error at compile-time! 

Я понимаю, что на интерпретируемом языке различие между временем компиляции и временем выполнения является тонким, но имеет значение, когда дело доходит до производительности. И это второе преимущество: ::class более совершенен.

+0

Спасибо, это на самом деле ответит на мой вопрос. В моей ситуации я буду использовать ':: class'. – Carlos2W

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