Как добавить свойство к объекту в PHP>= 5.3 строгий режим без генерации ошибки


это должно быть просто, но я не могу найти ответ....

у меня есть общий объект stdClass $foo без свойств. Я хочу добавить новое свойство $bar для него это еще не определено. Если я это сделаю:

$foo = new StdClass();
$foo->bar = '1234';

PHP в строгом режиме жалуется.

Как правильно (вне объявления класса), чтобы добавить свойство к уже созданному объекту?

примечание: Я хочу, чтобы решение работало с общим PHP объект типа stdClass.

немного предыстории по этому вопросу. Я декодирования JSON-строку, которая представляет собой массив объектов JSON. json_decode() генерирует массив объекта StdClass. Мне нужно манипулировать этими объектами и добавить свойство к каждому из них.

7 56

7 ответов:

Если вам абсолютно необходимо добавить свойство к объекту, я считаю, что вы можете привести его как массив, добавить свое свойство (как новый ключ массива), а затем вернуть его как объект. Единственный раз, когда вы столкнетесь с stdClass объекты (я считаю) - это когда вы бросаете массив в качестве объекта или когда вы создаете новый stdClass объект с нуля (и конечно, когда вы json_decode() что-то-глупо меня за забвение!).

вместо:

$foo = new StdClass();
$foo->bar = '1234';

ты:

$foo = array('bar' => '1234');
$foo = (object)$foo;

или если у вас уже был существующий объект stdClass:

$foo = (array)$foo;
$foo['bar'] = '1234';
$foo = (object)$foo;

также как 1 вкладыш:

$foo = (object) array_merge( (array)$foo, array( 'bar' => '1234' ) );

делай так:

$foo = new StdClass();
$foo->{"bar"} = '1234';

теперь попробовать:

echo $foo->bar; // should display 1234

Если вы хотите отредактировать декодированный JSON, попробуйте получить его как ассоциативный массив вместо массива объектов.

$data = json_decode($json, TRUE);

вы должны использовать магические методы _ _ Set и __get. Простой пример:

class Foo
{
    //This array stores your properties
private $content = array();

public function __set($key, $value)
{
            //Perform data validation here before inserting data
    $this->content[$key] = $value;
    return $this;
}

public function __get($value)
{       //You might want to check that the data exists here
    return $this->$content[$value];
}

}

конечно, не используйте этот пример так : никакой безопасности вообще :)

EDIT : видел ваши комментарии, здесь может быть альтернатива на основе отражения и декоратора :

 class Foo
 {
private $content = array();
private $stdInstance;

public function __construct($stdInstance)
{
    $this->stdInstance = $stdInstance;
}

public function __set($key, $value)
{
    //Reflection for the stdClass object
    $ref = new ReflectionClass($this->stdInstance);
    //Fetch the props of the object

    $props = $ref->getProperties();

    if (in_array($key, $props)) {
        $this->stdInstance->$key = $value;
    } else {
        $this->content[$key] = $value;
    }
    return $this;
}

public function __get($value)
{
    //Search first your array as it is faster than using reflection
    if (array_key_exists($value, $this->content))
    {
        return $this->content[$value];
    } else {
        $ref = new ReflectionClass($this->stdInstance);

        //Fetch the props of the object
        $props = $ref->getProperties();

        if (in_array($value, $props)) {

        return $this->stdInstance->$value;
    } else {
        throw new \Exception('No prop in here...');
    }
}
 }
}

PS: Я не тестировал свой код, только общую идею...

Я всегда использую таким образом:

$foo = (object)null; //create an empty object
$foo->bar = "12345";

echo $foo->bar; //12345

Я не знаю, является ли его более новой версией php, но это работает. Я использую php 5.6

    <?php
    class Person
    {
       public $name;

       public function save()
       {
          print_r($this);
       }
    }

   $p = new Person;
   $p->name = "Ganga";
   $p->age = 23;

   $p->save();

это и есть результат. Метод save фактически получает новое свойство

    Person Object
    (
       [name] => Ganga
       [age] => 23
    )

да, можно динамически добавлять свойства к объекту PHP.

это полезно, когда частичный объект получен из javascript.

JAVASCRIPT сторона:

var myObject = { name = "myName" };
$.ajax({ type: "POST", url: "index.php",
    data: myObject, dataType: "json",
    contentType: "application/json;charset=utf-8"
}).success(function(datareceived){
    if(datareceived.id >= 0 ) { /* the id property has dynamically added on server side via PHP */ }
});

PHP сторона:

$requestString = file_get_contents('php://input');
$myObject = json_decode($requestString); // same object as was sent in the ajax call
$myObject->id = 30; // This will dynamicaly add the id property to the myObject object

или просто отправьте фиктивное свойство из javascript, которое вы заполните в PHP.