2009-05-20 8 views
6

だから、私はPHPでOOPするのではない。関数の中でオブジェクトを呼び出す

ここに私の問題があります。私は関数から呼び出すことができるオブジェクトを持っています。ここにコードがあります。

$obj = new OBJ(); 

function go($url){ 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

go('http://www.mysite.com/hello'); 

これは私にエラー

致命的なエラーを与える:非オブジェクト

答えて

35

にこれは、OOPの問題ではありません)メンバ関数grabArray(に呼び出して、それはスコープの問題です。 $ objは関数go()の内部では見えません。あなたのいずれか

、それをパラメータとして渡す、またはグローバルキーワード(推奨されません)で、関数のスコープにそれを持参する必要が推奨される方法

$obj = new OBJ(); 

go('http://www.mysite.com/hello', $obj); 

function go($url, $object) 
{ 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

推奨されない方法

$obj = new OBJ(); 

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    global $obj; 
    $array = $object->grabArray($url); 
    echo $array['hits']; 
} 

ありますOOPのコンポジションのコンセプトに似た別のソリューション - あなたはOBJのインスタンスを作成するためのgo()関数を作成します。

go('http://www.mysite.com/hello'); 

function go($url) 
{ 
    $obj = new OBJ(); 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

あなたが行くを実行するたびに()ブランドの新しいOBJのインスタンスを作成したいので、これは、しかし、おそらく理想的ではありません。あなたは、静的変数

function go($url) 
{ 
    static $obj; 
    if (is_null($obj)) 
    { 
     $obj = new OBJ(); 
    } 
    $array = $obj->grabArray($url); 
    echo $array['hits']; 
} 

で「キャッシュ」、外出先内部OBJのインスタンス()によってこの問題を解決できた。しかし、あなたが他のほかのどこOBJのインスタンスを使用しない場合は、この構図のようなアプローチは、実際には便利ですgo()関数の内部 - 他の場所で使用する場合は、パラメータのアプローチが最適です。

これは、手近な課題に適したソリューションを選ぶことです。

+0

素晴らしいです。ありがとうございました! – Tim

+0

3番目の方法が大好き – doflamingo

関連する問題