Передача объектов в конструктор PHP ошибка - PullRequest
3 голосов
/ 17 января 2010

Можно ли передать объект в конструктор класса PHP и установить этот объект как глобальную переменную, которая может использоваться остальными функциями в классе?

Например:

class test {

   function __construct($arg1, $arg2, $arg3) {
      global $DB, $ode, $sel;

      $DB = arg1;
      $ode = arg2;
      $sel = $arg3;
   }

   function query(){
      $DB->query(...);
   }

}

Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Вызов функции-члена не для объекта». Есть какой-либо способ сделать это? В противном случае я должен передать объекты в каждую отдельную функцию напрямую.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 17 января 2010

Возможно, вы хотите присвоить их значениям на $this.

В вашем конструкторе вы должны сделать:

$this->DB = $arg1;

Тогда в вашей функции запроса:

$this->DB->query(...);

Это должно быть сделано аналогично другим аргументам вашего конструктора.

$this в контексте экземпляра - это то, как вы ссылаетесь на текущий экземпляр. Также есть ключевые слова parent:: и self:: для доступа к членам суперкласса и статическим членам класса соответственно.

2 голосов
/ 17 января 2010

Как примечание ...
Даже несмотря на то, что это не требуется , обычно считается, что лучше объявить переменные-члены внутри класса. Это дает вам лучший контроль над ними:

<?php
class test {
    // Declaring the variables.
    // (Or "members", as they are known in OOP terms)
    private $DB;
    protected $ode;
    public $sel;

    function __construct($arg1, $arg2, $arg3) {
      $this->DB = arg1;
      $this->ode = arg2;
      $this->sel = $arg3;
    }

    function query(){
      $this->DB->query(...);
    }
}
?>

Подробнее о разнице между private, protected и public.

см. PHP: Visibility
1 голос
/ 13 сентября 2012

скажем, у вас есть объект БД

$db = new db();

и другой объект:

$object = new object($db);

class object{

    //passing $db to constructor
    function object($db){

       //assign it to $this
       $this-db = $db;

    }

     //using it later
    function somefunction(){

        $sql = "SELECT * FROM table";

        $this->db->query($sql);

    }

}
1 голос
/ 17 января 2010

Вы можете сделать это довольно легко, сохранив аргумент как свойство объекта:

function __construct($arg1, $arg2, $arg3) {
   $this->db = arg1;
}

function f()
{
  $this->db->query(...);
}
...