0

私はこれが常に行われていることを知っていますが、何らかの理由で、それは私には少し意味がありません。[@#$%を挿入してください!ここで]この(おそらく)明白な解決策のための適切なOOP手順が何であるかわかりません。私はAbstract型とInterface型のクラスについて簡単に読みましたが、私が求めていることを実行する例は役に立ちませんでした。

これがセットアップです...

この例では、2つのクラスがあります。1つはスクリプトから呼び出すもので、もう2つはスクリプトから、または最初に呼び出したクラス内から呼び出すことができます。疑似コード:

<?php

    // Some code here

    $timer = new timer();
    $doSomethingCool = new doSomethingCool();

    $doSomethingCool->doIt();
    print $timer->length();



    class timer {
        private $startTime;
        private $stopTime;
        private $length;

        public function start() {
            // Start running the timer
        }
        public function end() {
            // End the timer
        }
        public function length() {
            // Return the length of the timer
            return $this->length;
        }
    }

    class doSomethingCool {
        public function doIt() {

            $timer->start();

            // Some code here

            $timer->end();

        }
    }

?>

私はこれを「実行」することができましたが(以下を参照)、この回避策は厄介であり、これが適切なオブジェクト指向モデリングではないと100%確信しています。

<?php
    // Start by declaring all classes and pass all classes to themselves...

    $doSomethingCool = new doSomethingCool();
    $timer = new timer();
    $class = array(
        'doSomethingCool'=>$doSomethingCool,
        'timer'=>$timer
    );

    $doSomethingCool->class = $class;
    $timer->class = $class;


    // Some code here
    $class['doSomethingCool']->doIt();
    print $timer->length();



    class timer {
        // In each class we now declare a public variable
        // 'class' that we had passed all class instances to...
        public $class;

        private $startTime;
        private $stopTime;
        private $length;

        public function start() {
            // Start running the timer
        }
        public function end() {
            // End the timer
        }
        public function length() {
            // Return the length of the timer
            return $this->length;
        }
    }

    class doSomethingCool {
        public $class;

        public function doIt() {

            $this->class['timer']->start();

            // Some code here

            $this->class['timer']->end();

        }
    }

?>

E_STRICTのため、使用したくありません$timer::start();

それで、解決策は何ですか、ご列席の皆様?ありがとう!

4

3 に答える 3

3

他のクラスをあるクラスに注入したいと思います。もしそうなら:

class Database {}
class Timer {}

class Foo
{
    protected $database;
    protected $timer;

    public function __construct(Database $database, Timer $timer)
    {
         $this->database = $database;
         $this->timer = $timer;
    }

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

}

$database = new Database();
$timer = new Timer();
$foo = new Foo($database, $timer);

もちろん、実際のクラスを追加する必要があることに注意してください(私が使用した場所DatabaseTimer)。

于 2012-08-04T17:53:06.367 に答える
2

多形的な方法:

class SomeClass {
    protected $db;
    function __construct(Database $database) {
        $this->db = $database;
    }
    function doIt() {
        // . . .
    }
}

class TimedSomeClass extends SomeClass {
    protected $timer;
    function __construct(Database $db, Timer $timer) {
        $this->timer = $timer;
        parent::__construct($db);
    }

    function doIt() {
        $this->timer->start();
        parent::doIt();
        $this->timer->stop();
    }
}

ポリモーフィズムはこの状況に最適なツールではないかもしれませんが、質問ではポリモーフィズムを実行したいように思われるので、ここにあります。

于 2012-08-04T17:59:07.327 に答える
0

クラスAのオブジェクトaがクラスBのオブジェクトbにアクセスするようにする場合、 bが何らかの意味でグローバルでない場合は、それをaに渡す必要があります。あなたの場合、あなたはこれを行うことができます:

  • コンストラクターに追加するnew doSomethingCool($timer)か、
  • setメソッドを作成して使用し、オブジェクトハンドルをプライベートプロパティとして保存します。$doSomethingCool->setTimer( $timer );また
  • にパラメータとして渡すことによってdoIt()

もう1つの方法は、タイマークラスにシングルトンテンプレートを使用することです。これにより、基本的にタイマーがglbalオブジェクトになりますが、このようなテンプレートは現在、一般的に非推奨になっています。

于 2012-08-04T17:47:29.667 に答える