0

だから私はこのようなものを持っています:

class SomeClass{
    //do some stuff
}

$variable  = new SomeClass();

たとえば、SomeClass.php という名前の php ファイルで、OtherClass.php という名前の他のクラスで次のようなことを行いたいとします。

class OtherClass{
    function doSomething(){
        $variable->call_some_method();
    }
}

どうすればこれを達成できますか?私はグローバル変数について考えましたが、Zend のようなフレームワークが次のようなことをしているのを見てきました。

では、何が良いのか、本質的に私がやりたいことは何か。

注: 私がグローバル変数を使いたいと思っている人もいますが、これは正しくありません。Zend がクラスで $this->view のようなことをしてビューに何かを送信し、ビューで $this->view を呼び出して送信されたものを取得する方法を再現しようとしています。これはグローバルを通じて行われたと思いました...

4

4 に答える 4

4

この概念は「依存性注入」と呼ばれ、それを行うためのベスト プラクティスであると考えられています。

class SomeClass{
    //do some stuff
}

$some  = new SomeClass();

class OtherClass{
    function doSomething(SomeClass $some){
        $some->call_some_method();
    }
}

$otherclass = new OtherClass();
$otherclass->doSomething($some);

または、時間の構築に依存関係を挿入することもできます。

class OtherClass{
    private $some = null;

    function __construct(SomeClass $some){
        $this->some = $some;
    }

    function doSomething(){
        $this->some->call_some_method();
    }
}

達成したいことと、依存関係が必要な頻度によって異なります。

于 2012-11-11T19:45:08.317 に答える
1

まず、Zend Framework のすべて (OOP、MVC アーキテクチャなど) を壊すグローバル変数を Zend Framework に導入する方法を見つけたことを祝福したいと思います。

第二に、それは悪い習慣です。それは可能ですが、悪いことでもあります。この言語で何かを行うのに苦労している場合は、その目的を達成するためのより簡単な方法がある可能性があります。

これは答えではありませんが、あなたの問題と、抽象的な例ではなく別のクラスでグローバルに定義されたクラスインスタンスを使用したい理由をもっと詳しく教えてください。Web サイトや Web アプリケーションの構築に悪習を植え付けるのではなく、別のアプローチを提供することで、より優れたプログラマーになるのを支援できる可能性があります。

于 2012-11-11T19:44:36.187 に答える
0

必要なのは「拡張」だと思います。例を挙げます。

class Hello {

    public function world() {
        echo 'Hello World!';
    }

}

class someClass extends Hello {

    public function doSomething() {
        $this->world();
    }
}


$obj = new someClass();
$obj->doSomething();
于 2012-11-11T19:50:40.583 に答える
-1

それにはいくつかの方法があります。

1) SomeClass を拡張する

class OtherClass extends SomeClass
{

 function doSomething(){
     $this->call_some_someclass_method();
 }

}

2) SomeClass インスタンスを OtherClass に渡します (適切なコーディング方法ではありません)。

$a = new SomeClass();
$b = new OtherClass();
$b->someInstance($a);

class OtherClass extends SomeClass
{
 function someInstance($someClass){
    $this->someClass = $someClass;
 }
 function doSomething(){
     $this->someClass->call_some_method();
 }

}

3) OtherClass 内にインスタンスを作成する

class OtherClass extends SomeClass
    {
     function someInstance(){
        $this->someClass = new SomeClass;
     }
     function doSomething(){
         $this->someInstance();
         $this->someClass->call_some_method();
     }

    }
于 2012-11-11T19:57:47.433 に答える