3

stdClass配列をオブジェクトに変換するために使用しますが、

function array_to_object($array)
{
    if(!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    foreach($array as $key => $value)
    {
        $key = (string) $key ;
        $object->$key = is_array($value) ? array_to_object($value) : $value;
    }

    return $object;
}

$type = array(
    "category"  => "admin",
    "person"    => "unique"
);

$type = array_to_object($type);

var_dump($type->category); // string(5) "admin" 

もちろん、そもそも配列に設定されていないプロパティを取得したい場合はエラーになりますが、

var_dump($type->image);

エラーメッセージ、

Notice: Undefined property: stdClass::$image in C:\wamp\www\test\2012\php\array_to_object.php on line 52
NULL

プロパティが見つからないnull場合に関数を返すようにできますか?

 var_dump($type->image); //NULL

編集:

上記の関数をクラス化することにしましたが、それでもうまく__get()動作しません。

class objectify
{
    public function __get($name)
    {
        if (isset($this->$name) === true){
            return $this->$name;
        } else {
            return null;
        }
    }

    public function array_to_object($array)
    {
        if(!is_array($array)) {
            return $array;
        }

        $object = self::__get($name);
        foreach($array as $key => $value)
        {
            $key = (string) $key ;
            $object->$key = is_array($value) ? self::array_to_object($value) : $value;
        }
        return $object;
    }
}


$object = new objectify();

$type = array(
    "category"  => "admin",
    "person"    => "unique"
);

$type = $object->array_to_object($type);
var_dump($type->category);
var_dump($type->image);

エラーメッセージ、

Notice: Undefined variable: name in C:\wamp\www\test\2012\php\array_to_object.php on line 85
string(5) "admin" 
Notice: Undefined property: stdClass::$image in C:\wamp\www\test\2012\php\array_to_object.php on line 107
NULL

この行がエラーの原因だと思いますが、どうすればよいかわかりません...

$object = self::__get($name);
4

3 に答える 3

2

__get()に関するジョンの答えをまとめる:

<? //PHP 5.3+

class maybeBag {
    public function __get($name){
        if (isset($this->$name) === true){
            return $this->$name;
        } else {
            return null;
        }
    }

    public static function ensureIsObject($values){
        if (\is_array($values) !== true){
            return $values;
        }
        $o = new static(); //Late-bound make instance of own class
        foreach($values as $key => $value){
            $o->$key = static::ensureIsObject($value);
        }
        return $o;
    }
}

//Demo

$type = array(
    'category' => 'admin',
    'person'   => 'unique'
);
$type = maybeBag::ensureIsObject($type);

var_dump($type->category); //string(5) "admin"
var_dump($type->image); //NULL

?>
于 2012-05-03T01:41:17.273 に答える
2

クラス内でこの魔法のメソッドを使用します。未定義のプロパティが要求されるたびに、null が返されます。

PHP 7 の場合:

public function __get($prop){
    return $this->$prop ?? null;
}

PHP 5 の場合:

public function __get($prop){
    return isset($this->$prop) ? $this->$prop: null;
}
于 2018-01-04T18:33:48.540 に答える
0

テストされていませんが、魔法の方法を使用するとうまくいくと思い__get()ます:

public function __get($parameter)
{
    return (isset($this->$parameter)) ? $this->$parameter : null;
}
于 2012-05-03T01:07:10.263 に答える