Передача элемента объекта в класс не как строка (как константа) в php? - PullRequest
2 голосов
/ 04 июня 2010

Как я могу динамически передавать "элементы" в функцию класса?

Например, здесь это кусок некоторого класса и его функции, где я объявляю элемент объекта (items) как $ b:

//..........
     public function __add2SomeObj($b) {    

        $namespc = $this -> __someObj();  // __someObj() returns object
        $namespc -> cats = $b;

            }
//...................

Могу ли я передать любое другое имя вместо cats динамически, чтобы оно не было объявлено как строка? то есть что-то вроде:

    //..........
         public function __add2SomeObj($a,$b) { 

            $namespc = $this -> __someObj();  // __someObj() returns object
            $namespc -> $a = $b;

                }
    //...................
} //end of class started above

$t=new aboveClass()
$t->__add2SomeObj("cats", array(1=>"PussyCat",2=>"Scratchy"));
$t->__add2SomeObj("dogs", array(1=>"Waffy",2=>"Sharik")); // once again but dogs...

Должен ли я определить константу или что для этого нужно, или я должен объявить этот защищенный вариант как объект типа (object) $vaaar? Извините, я немного не знаком с PHP ООП ...

Ответы [ 3 ]

1 голос
/ 04 июня 2010

Да, вы можете сделать это. Читайте о переменных переменных :

Свойства класса также могут быть доступны с помощью имен переменных свойств. Имя свойства переменной будет разрешено в пределах области, из которой выполняется вызов. Например, если у вас есть выражение, такое как $foo->$bar, локальная область будет проверена на $bar, а ее значение будет использовано в качестве имени свойства $foo. Это также верно, если $bar является доступом к массиву.


Однако вы должны быть осторожны при работе с массивами:

$namespc->$a[0]

получит первый элемент из массива, который будет возвращен $namespc->$a.

Принимая во внимание

$namespc->{$a[0]}

сначала разрешит $a[0], т.е. получит первое значение массива $a и будет использовать его в качестве имени свойства.

1 голос
/ 04 июня 2010

Вы спрашиваете, можете ли вы решить во время выполнения, какое свойство изменить внутри __add2SomeObj, как во втором листинге. Вы можете, и вы сделали правильно.

Однако свойства должны быть строками __add2SomeObj, поэтому следует убедиться, что параметр $a является строкой (он будет автоматически преобразован в строку, но это может дать неожиданные результаты, если $a является объектом или массив).

Во-вторых, вы позволяете вызывающей стороне изменять произвольное свойство. Это может или не может нарушать инкапсуляцию вашего класса в зависимости от класса __someObj возвратов и класса __add2SomeObj. Он также создаст динамическое свойство для объекта $namespce (то есть того, которое существует не во всех объектах этого класса), которое вам может не понадобиться.

Наконец, и имеет следствие предыдущего пункта, __add2SomeObj может привести к фатальной ошибке. Поэтому я бы сказал, что вам лучше проверить параметр $a по набору разрешенных имен свойств.

0 голосов
/ 04 июня 2010

Ваш синтаксис правильный:

$obj->cats = $b;

и

$a = 'cats';
$obj->$a = $b;

сделает то же самое.

Что касается того, сделать ли "cats" константой, решать вам. Я бы предложил поднять сообщение об ошибке:

error_reporting(E_ALL | E_STRICT);

Таким образом, если вы случайно введете "cast" и это недопустимый член, вы получите сообщение об ошибке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...