Доступ к статическим данным

в 9:33, , рубрики: php, php 5.3, ооп, метки: ,

Начиная с версии 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js