PHP'兄弟'的课程?它是如何工作的?

时间:2012-08-04 17:26:10

标签: php oop class interface

我知道这是一直都在做的,但出于某种原因,这对我来说并没有任何意义。 [插入@#$%!这里]我不知道适当的OOP程序是什么(假设)明显的解决方案。我简要地阅读了抽象和接口类型类,但没有任何关于我正在问的问题的例子。

所以这是设置......

在这个例子中,我有两个类,一个我将从我的脚本调用,另外两个我可以从我的脚本或我调用的第一个类中调用。伪代码:

<?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();

女士们,先生们,解决方案是什么?谢谢!

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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();
    }
}

多态性可能不是这种情况的最佳工具,但听起来你想在你的问题中以多态方式进行,所以就是这样。

答案 2 :(得分:0)

如果您希望A类的对象 a 访问B类的对象 b ,那么您必须将其传递给 a if < strong> b 在某种意义上不是全球性的。你可以这样做:

  • 将其添加到构造函数new doSomethingCool($timer)
  • 通过创建和使用set方法并将对象句柄存储为私有属性,例如。 $doSomethingCool->setTimer( $timer );
  • doIt()
  • 中作为参数传递

另一种方法是使用单例模板作为计时器类 - 这实际上使计时器成为一个glbal对象,但现在这种模板通常已被弃用。