За последние 24 часа нас посетили 16563 программиста и 1642 робота. Сейчас ищут 1049 программистов ...

Класс как переменная: суть одна, но разная реализация и результат разный

Тема в разделе "Прочие вопросы по PHP", создана пользователем FudziKama, 24 окт 2018.

  1. FudziKama

    FudziKama Новичок

    С нами с:
    24 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    Приветствую всех.

    Никак не могу понять в чем существенная разница, объясните, пожалуйста. В двух словах (код ниже),
    создается собственный класс, в котором на основе сторонних классов и методов в конструкторе инициализируются некоторые свойства, одно из которых есть класс. Далее в методе класса (add2) осуществляется обращение к статическому методу стороннего класса, который символизирует объявленное в конструкторе свойство, указанное выше. Но при таком подходе получается ошибка (см. в коде). Если же в методе (add1) непосредственно получить переменную-класс и уже с нее отработать статический метод стороннего класса, то все прекрасно отрабатывается.

    Может быть нужен какой-то особенный синтаксис? Но ничего подобного не нашел, подскажите, пожалуйста, если решение в принципе существует.

    PHP:
    1. use Vendor\Main\EntityTableClass as ETC;
    2.  
    3. class MyEntity
    4. {
    5.     //Свойства
    6.     protected $objEntity;
    7.     protected $dataClass;
    8.  
    9.     //Конструктор
    10.     function __construct($tablename){
    11.         $objTable = ETC::getByName($tablename);
    12.         $this->objEntity = ETC::compileEntity($objTable);
    13.         $this->dataClass = $this->objEntity->getDataClass();
    14.     }
    15.  
    16.     //отрабатывает корректно
    17.     function add1($arParams){
    18.         $classEntity = $this->objEntity->getDataClass();
    19.         $res = $classEntity::add($arParams);
    20.         return $res;
    21.     }
    22.  
    23.     //выдает ошибку:
    24.     //Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM) in /data/local/myclasses/main/myentity.php on line 24
    25.     function add2($arParams){
    26.         $res = $this->dataClass::add($arParams);
    27.         return $res;
    28.     }
    29. }
     
    #1 FudziKama, 24 окт 2018
    Последнее редактирование: 24 окт 2018
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Без описания класса Vendor\Main\EntityTableClass понять сложно, что у Вас там творится в $this->objEntity
     
  3. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Если подразумевается "имя класса", то сойдет такая конструкция:
    PHP:
    1. $res = call_user_func([$this->dataClass, 'add'], $arParams);
     
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    да
     
  5. FudziKama

    FudziKama Новичок

    С нами с:
    24 окт 2018
    Сообщения:
    9
    Симпатии:
    0
    В $this->objEntity творится то же самое, что и в $classEntity. var_dump, по крайней мере, дает идентичный результат для одного и другого.
    С другой стороны, а какие возможны варианты, что при передаче через свойство класса та же самая информация "теряется"? Или это все же php не приемлет такой конструкции ***->***:: ???
    Сообщение об ошибке именно об этом же по-еврейски )) говорит.