Переменный подкласс PHP и доступ к родительским методам - PullRequest
0 голосов
/ 17 октября 2019

Это похоже на плохую модель дизайна, но я все равно спрошу. Я хотел бы получить доступ к родительским методам из переменно выбранного дочернего класса. В этом примере $ db не найден.

class car {
    function __construct(){
        $db = doSomethingGetDBObj();
        global $db; $this->db = $db;
    }
}

class engine extends car {

    var $valve;
    function whichValve( $which ){
        $this->valve = new $which();
        var_dump( $this->valve->motion() );
    }
}

class valve1 extends engine {
    function motion(){
        return( parent::$db->GetRow("query for valve 1") );
    }
}

class valve2 extends engine {   
    function motion(){
        return( parent::$db->GetRow("query for valve 2") );
    }
}

$drive = new engine();
$drive->whichValve( "valve2" );

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Во-первых, вы не должны обращаться к суперглобалам, чтобы получить объект БД. Вместо этого перейдите в конструктор.

Я добавил свойство protected $db в класс, что означает, что к нему нельзя получить доступ вне класса (но потомки могут получить к нему доступ).

Затем в дочерних классах вы можете получить доступ к свойству $db с помощью $this->db, поскольку класс является потомком car.

Некоторые другие незначительные предложения:

  • Я бы предложил заглавную букву в первой букве имени класса
  • Нет необходимости заключать скобки в операторы возврата
  • Вместо передачи имени класса whichValve,передать построенный объект (таким способом отладить код намного проще)
class car {
    protected $db;

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

class engine extends car {
    protected $valve;

    function whichValve( $which ){
        $this->valve = new $which();
        var_dump( $this->valve->motion() );
    }
}

class valve1 extends engine {
    function motion(){
        return $this->db->GetRow("query for valve 1");
    }
}

class valve2 extends engine {   
    function motion(){
        return $this->db->GetRow("query for valve 2");
    }
}
0 голосов
/ 17 октября 2019

Ключевое слово parent предназначено для доступа к методу родителя, когда есть локальные переопределенные. Вы можете использовать $this->db для доступа к атрибутам db, даже если они созданы в родительском классе.

...