PHP - как сказать объекту, кто его создатель? - PullRequest
1 голос
/ 16 февраля 2011

HI!

В основном я прошу вас сказать мне: как поместить "родительскую" ссылку в объект

Мне нужно сделать пример «извлечения метода с методом объекта» - один из наиболее часто используемых рефакторинга в Java или C #

в Java ссылка на «родительский объект» выглядит следующим образом:

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

и вот оно:)

но я не знаю, как сделать то же самое в PHP

возможно, если это невозможно, вы скажете мне, как вы извлекаете свои методы из классов в новый класс, это должно делать то же, что и этот метод.

так другими словами ...

1 - У меня есть класс с большим и трудным для чтения / рефакторинга методом.
2 - Я извлекаю этот метод в новый класс, предоставляя ему поля вместо параметров и метод, такой как «execute» - чтобы обработать все, что этот класс должен сделать для меня.
3 - Я помещаю объект своего класса в свой старый класс функций и вызываю его метод «execute» - так что вся логика, которая была в my_big_method, выполнена.

Ответы [ 5 ]

1 голос
/ 16 февраля 2011

Лучший метод - это наследование, где вы вызываете ключевое слово 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

если вы смотрите на Injection, вы можете сделать что-то вроде этого.

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);
0 голосов
/ 16 февраля 2011

Я пытался использовать «$ 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);
    }

}

Правильно ли сделан конструктор?

и теперь мне нужно сделать объект MakeTransfer внутри моего класса Account - я пробовал таким образом - это нормально?

    class Account {
    // (...)

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

и снова - могу ли я просто это "$ this" просто так?;) будет ли работать мой код?он действительно компилируется в Eclipse, но это может ничего не значить.

0 голосов
/ 16 февраля 2011

PHP версия вашего примера:

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

не сильно отличается от Java, просто меньше типов и больше знаков $.

"parent" - это ключевое слово в php, как java "super", поэтому ваш вопрос немного запутан.

0 голосов
/ 16 февраля 2011

Вы пытались использовать ключевое слово $ this?

0 голосов
/ 16 февраля 2011

Самый простой способ - передать ссылку на родительский объект в конструкторе, хотя, возможно, я неправильно понимаю вашу цель.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...