PHP - 如何告诉其创建者的对象?

时间:2011-02-16 17:48:42

标签: php object refactoring

HI!

基本上我要求你告诉我的是如何将“父”引用放入对象

我需要它来制作“使用方法对象提取方法”的例子 - 在Java或C#中主要使用的重构之一

在Java中引用“父对象”的

如下所示:

class someClass {
  MyObject myObj = new MyObject(this);
}

就是这样:))

但我不知道,如何在PHP中做同样的事情

也许如果它不可能你会告诉我你如何从你的课程中提取你的方法到新课程,那就必须按照那种方法做的。

所以换句话说......

1 - 我上课时有大而难以阅读/重构的方法 2 - 我将该方法提取到新类,为其提供字段代替参数和方法,如“执行” - 这个类必须为我做的所有操作。
3 - 我将我的类的对象放到我的旧函数类中,并将其方法称为“execute” - 所以my_big_method中的所有逻辑都已完成。

5 个答案:

答案 0 :(得分:1)

最好的方法是继承,您可以调用parent关键字来访问父类,如下所示:

class Child extends Father
{
    public function __construct()
    {
        parent::__construct();
    }
}

class Father
{
    public function __construct()
    {
       echo "Father says hello";
    }
}

new Child();

使用parent keyowrd,您可以调用构造函数,如parent::__construct()

示例:http://codepad.org/kW6dfVMs

如果你看着注射,那么你可以做这样的事情。

class Master
{
    private $Slave;

    public function __construct(Slave $Slave)
    {
         $this->Slave = $Slave;
    }
}

$Master = new Master(new Slave);

如果您不确定应该传入的对象,但是您知道它应该有一个特定的接口/方法集,那么您可以稍微复杂一些,并执行类似的操作:

class Master
{
    private $Slave;

    public function __construct(ISlave $Slave)
    {
         $this->Slave = $Slave;
    }
}

interface ISlave
{
    //Declaration of methods
}

class SomeSlaveObject implements ISlave{}

$Master = new Master(new SomeSlaveObject);

答案 1 :(得分:0)

最简单的方法是在构造函数中传递对父对象的引用,尽管我可能误解了你的目标。

class myClass {
  private $parent = false;
  function __construct ($parent=false) {
    $this->parent = $parent;
  }
}

如果您是extend基类,则可以使用parent运算符:

class otherClass {
   function someMethod() {
       return 1;
   }
}
class myClass extends otherClass {
   function aMethod() {
      // parent keyword here would refer to "otherClass"
      return $this->someMethod();
  }
}

查看parent上的文档:http://php.net/manual/en/keyword.parent.php

答案 2 :(得分:0)

您是否尝试过使用$ this关键字?

答案 3 :(得分:0)

您的示例的PHP版本:

  class someClass {
    public function createObject() {
        $myObj = new MyObject($this);
    }
  }

与java没什么不同,只是更少的类型和更多的$符号。

“parent”是php中的关键字,就像java“super”一样,所以你的问题有点令人困惑。

答案 4 :(得分:0)

我尝试使用“$ this”,但我公司的“php guy”告诉我,我不能使用$ this,而不是引用当前类的字段或函数(它不能引用整个类)

我的代码如下:

重构的类:

class AccountBeforeRefactoring {
    // (...)
    public function makeTransfer($amount, $destinationAccount){
        $transferFee = 1;
        if ($amount > 1000){
            $transferFee = 1 + $amount * 0.0001;            
        }

        $this->connectToElixir();

        // (...)         
        // (...)         
        // (...)

        $this->debit($amount + $transferFee);
    }   
}

它变成了: 提取的类 - 这是我的方法:

    class TransferMaker {

    private $account;
    private $amount;
    private $destinationAccount;
    private $transferFee;

    public function __construct($source, $amount, $destinationAccount){
        $this->account = $source;
        $this->amount = $amount;
        $this->destinationAccount = $destinationAccount;
        $this->transferFee = 1;
    }

    public function make(){        
        if ($this->amount > 1000){
            $this->transferFee = 1 + $this->amount * 0.0001;            
        }

        $this->account->connectToElixir();

        // (...)         
        // (...)         
        // (...)

        $this->account->debit($this->amount + $this->transferFee);
    }

}

是以正确方式制作的构造函数吗?

现在我需要在我的Account类中创建MakeTransfer的对象 - 我试试这种方式 - 它可以吗?

    class Account {
    // (...)

    public function makeTransfer($amount, $destinationAccount){
        new TransferMaker($this, $amount, 
                $destinationAccount).make();
    }
}

又一次 - 我可以就像这样的“$ this”吗? ;) 我的代码会起作用吗?它确实在Eclipse中编译,但这可能意味着没有。