Начиная с версии 5.3 появилась возможность обращаться к статическим данным классов используя переменную. Благодаря этому мы практически забыли об ошибке «syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM», которая возникала при попытке использования оператора "::" как-то «не так».
Но, как мне кажется, об открывшихся возможностях знают не все.
Создадим интерфейс, класс и объект для экспериментов.
interface bar{
const SOME_CONST = 'SOME_CONST';
static public function static_public_function();
}
class foo implements bar{
static public $static_public_property = 'static_public_propery';
static public function static_public_function(){
return 'static_public_function';
}
}
$object = new foo();
Код, который работает как в 5.3 так и ранее. Имея в наличии объект необходимо было выяснить его класс.
echo foo::SOME_CONST . PHP_EOL; // SOME_CONST
echo foo::$static_public_property . PHP_EOL; // static_public_property
echo foo::static_public_function() . PHP_EOL; // static_public_function
echo bar::SOME_CONST . PHP_EOL; // SOME_CONST
Код, который работает начиная с PHP 5.3. Теперь нет необходимости указывать класс.
echo $object::$static_public_property . PHP_EOL; // static_public_property
echo $object::SOME_CONST . PHP_EOL; // SOME_CONST
echo $object::static_public_function() . PHP_EOL; // static_public_function
Константы и статические методы можно было объявлять в интерфейсах начиная с самого начала появления интерфейсов в PHP. Но чтобы работать с ними нужно было указывать имя интерфейса или класса. Сейчас же можно использовать объект для доступа к этим данным. Можно сказать, что начиная с версии 5.3 константы и статические методы стали полноценной частью интерфейса.
Благодаря этому можно сократить количество употреблений имён классов и интерфейсов. А так же использовать автодополнение IDE имея «на руках» объект.
Автор: sectus