我知道这是一直都在做的,但出于某种原因,这对我来说并没有任何意义。 [插入@#$%!这里]我不知道适当的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();
。
女士们,先生们,解决方案是什么?谢谢!
答案 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);
请注意,您应该添加您的真实课程(我使用Database
和Timer
)。
答案 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)
或$doSomethingCool->setTimer( $timer );
或doIt()
另一种方法是使用单例模板作为计时器类 - 这实际上使计时器成为一个glbal对象,但现在这种模板通常已被弃用。