2017-02-18 2 views
1

私はPHP OOPを初めて使いました。「警告:空の値からデフォルトオブジェクトを作成する」は、しかし、私は次のコードでエラーが発生する理由を理解するのに苦労しています。PHPが値をネストされたオブジェクトに渡す警告:空の値からデフォルトオブジェクトを作成する

助けてください!あなたがオブジェクトのインスタンスを作成するとき

class A { public $varA; } 

class B { 
    public $varB; 
    function __construct(){ $varB = new A; } 
} 

$obj = new B; 
$obj->varB->varA = "Whatever"; 
+0

どうなるの 'コンストラクタをA'?また、クラスIIRCの外部から保護されたプロパティを設定することはできません。 – miken32

+1

こんにちはマイク。クラスAのコンストラクタはokを実行しますが、$ varA = "test"を使用します。そのコンストラクタでは無意味ですが、それは忘れ去られます。 \t 私が$ this-> varA = "test"を使用すると、あなたが言ったように、私はその保護されたプロパティを 'public'に変更することを条件に、うまく動作します。 $ varAはコンストラクタ関数にしかスコープされていないことがわかっているはずですが、時には見た目の木が見えないことがあります。助けてくれてありがとう。 – Robbie

+0

ええ、私は見つからなかった '$ this' – miken32

答えて

3

は、あなたがオブジェクトのプロパティに対処するために擬似変数「$この」を使用する必要があります。

コードでは、5行目の$varBはクラスプロパティに対処していません。代わりに、ローカル変数です。関数の完了直後に破棄されます(すべての参照が失われるため)。この動作の詳細については、マニュアルページ「variable scopes」を参照してください。

だからあなたのコードは次のようになります。あなたのクラスを与える場合

class A { public $varA; } 

class B { 
    public $varB; 
    function __construct(){ $this->varB = new A(); } 
} 

$obj = new B(); 
$obj->varB->varA = "Whatever"; 
var_dump($obj); 
+0

ありがとうございました。 – Robbie

+0

ところで、miken32は正しいです。クラスAの$ varAはパブリックである必要があります。ヘルプチャップに感謝します。これは私に私の腕をかわしていました! – Robbie

+0

特にありません。他のクラスからいくつかのプロパティを隠す場合があります。調整された方法でこれらの変数にアクセスするには、getter/setterメソッドを使用してクラスを拡張できます。しかし、ええ、 '$ obj-> varB-> varA ="何でも ";を作ってください;仕事、それは公開する必要があります。 –

関連する問題