2012-05-05 3 views
3

以下のようなケースにアクセスするマルチレベルオブジェクトプロパティで__get()を使用してnullを返すにはどうすればよいですか?__get()を使用してマルチレベルオブジェクトプロパティにアクセスする際にnullを返す方法

例えば、これは、私のクラスで、私はそれを使用する方法

class property 
{ 

    public function __get($name) 
    { 
     return (isset($this->$name)) ? $this->$name : null; 
    } 
} 


class objectify 
{ 

    public function array_to_object($array = array(), $property_overloading = false) 
    { 
     # if $array is not an array, let's make it array with one value of former $array. 
     if (!is_array($array)) $array = array($array); 

     # Use property overloading to handle inaccessible properties, if overloading is set to be true. 
     # Else use std object. 
     if($property_overloading === true) $object = new property(); 
      else $object = new stdClass(); 

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


     return $object; 

    } 
} 

$object = new objectify(); 

$type = array(
    "category" => "admin", 
    "person" => "unique", 
    "a"   => array(
     "aa" => "xx", 
     "bb"=> "yy" 
    ), 
    "passcode" => false 
); 


$type = $object->array_to_object($type,true); 
var_dump($type->a->cc); 

結果、

null 

が、ときに私はNULLとエラーメッセージが表示されます入力アレイは、

あります
$type = null; 
$type = $object->array_to_object($type,true); 
var_dump($type->a->cc); 

結果、

Notice: Trying to get property of non-object in C:\wamp\www\test...p on line 68 
NULL 

は、それがこのようなシナリオではNULLを返すことは可能ですか?

+1

PHPの言語はマルチレベルのオブジェクトを知らず、オブジェクトは常に文脈でアクセスされると昇順または降順のノードについて何も知らない単一のノードです。説明のために – hakre

答えて

0

public function __get($name) 
    { 
     return (isset($this->$name)) ? $this->$name : new property(); 
    } 
+0

答えにVicに感謝します。 – laukok

1

はい、それはですが、それはどのように説明するように簡単ではないのです。あなたはその問題に遭遇する理由をまず理解:

$value = $a->b->c; 

は、これが最初の$a->bためNULLを返します。だから、実際にあなたが書いた:

$value = NULL->c; 

ので、代わりのNULLをあなたはNULL -objectを返す必要が未設定の項目をお使いのベースクラスに似ていますし、それがNULLを表している(のはそれNULLObectをnamneてみましょう)。

あなたが想像できるように、あなたは本当にPHPでそれをNULLをシミュレートすることができないとPHPの言語機能がシームレスにこれを行うにはあまりにも限られています。

あなたは私がdescribbenきNULLObectに近づくことを試みることができますが。

class property 
{ 

    public function __get($name) 
    { 
     isset($this->$name) || $this->$name = new NULLObject(); 
     return $this->$name; 
    } 
} 


class NULLObject extends Property {}; 

これは正確にあなたが探しているものではないかもしれないことに注意してください。それはあなたのニーズにマッチしない場合は、PHPはあなたがプログラミングのために使用間違った言語であることをhighjly可能性があります。 PHPよりも優れたメンバーオーバーライド機能を持つ言語を使用してください。

関連質問:あなたがnullの代わりに新しいプロパティを返すことができ

+0

ありがとうございます。上記のスクリプトで 'NULLObect'を作る方法を尋ねることはできますか?ありがとう。 – laukok

+0

実際にあなたにとって理にかなっているかどうかは分かりませんが、単純なコード例で答えを広げました。 – hakre

+0

編集のためのhakreに感謝します。 – laukok

0

はい、私はそれが4年前になっていますけど、私が持っていました私はそれを解決しようとしている間、私はこのスレッドを発見した。

class NoneWrapper 
{ 
    private $data; 

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

    public function __get(string $name) 
    { 
     return property_exists($this->data, $name) 
      ? new NoneWrapper($this->data->$name) 
      : new None; 
    } 

    public function __call($name, $arguments) 
    { 
     if (is_object($this->data)) { 
      return (property_exists($this->data, $name)) 
      ? $this->data->$name 
      : null; 
     } else { 
      return null; 
     } 
    } 

    public function __invoke() 
    { 
     return $this->data; 
    } 
} 

class None 
{ 
    public function __get(string $name) { 
     return new None; 
    } 

    public function __call($name, $arguments) 
    { 
     return null; 
    } 

    public function __invoke() 
    { 
     return null;  
    } 
} 

$object = new NoneWrapper(
    json_decode(
     json_encode([ 
      'foo' => [ 
       'bar' => [ 
        'first' => 1, 
        'second' => 2, 
        'third' => 3, 
        'fourth' => 4, 
       ], 
      ] 
     ]) 
    ) 
); 

var_dump($object->foo->bar->baz()); // null 
var_dump($object->foo->bar->third()); // 3 
関連する問題