PHP $ эта переменная - PullRequest
26 голосов
/ 31 марта 2011

Я читаю некоторый код PHP, который я не мог понять:

class foo {
  function select($p1, $dbh=null) {
    if ( is_null($dbh) )
        $dbh = $this->dbh ; 
    return; 
  }

  function get() {
    return $this->dbh; 
  }
}

Я не могу найти объявление $this->dbh ($dbh) из класса.Мои вопросы:

  • Какое значение $this->dbh?

  • Является ли это локальной переменной для функции select()?

  • Является ли $this членом данных class foo?Почему в этом классе нет объявления для $dbh?

Ответы [ 6 ]

22 голосов
/ 31 марта 2011

PHP не является строгим для декларации.$ this-> dbh является членом класса.Я сделал следующий код, чтобы понять концепцию:

class foo {

 function foo(){
     $this->dbh = "initial value"; 
 }

 function select($p1, $dbh=null) {
    if ( is_null($dbh) )
        $dbh = $this->dbh ; 
    return; 
 }

 function get() {
     return $this->dbh; 
 }

}

Это то же самое, что:

class foo {
  var $dbh = "initial value"; 

  function select($p1, $dbh=null) {
    if ( is_null($dbh) )
       $dbh = $this->dbh ; 
    return; 
  }

  function get() {
     return $this->dbh; 
  }

}
18 голосов
/ 31 марта 2011

PHP не является строгим требованием объявления свойств класса.

  • При присваивании свойство создается автоматически.
  • Чтение из несуществующее свойство генерирует Уведомление, если E_STRICT включено.
  • Значением по умолчанию для любого неопределенного свойства является NULL
2 голосов
/ 31 марта 2011
  1. С кодом, который вы разместили, вы не можете знать, что такое значения $this->dbh.
  2. $dbh является свойством текущего объекта.$this используется для доступа к членам текущего объекта.
  3. Поскольку эта переменная определена вне какой-либо функции, это переменная, которая принадлежит классу, а не конкретной функции.По этой причине $this->dbh может использоваться в любой функции внутри класса.
  4. PHP не требует определять каждую используемую вами переменную.
1 голос
/ 31 марта 2011

PHP не заставляет вас объявлять свойства класса, но создает их для вас при первом обращении.Хорошо это или плохо, так или иначе, добро пожаловать в PHP.

Еще одна вещь, которую нужно проверить, это то, что у вас не происходит наследования.Ваше свойство $dbh определено в родительском классе?В простом коде, который вы опубликовали, нет ничего, но я могу представить, что вы немного упростили для общественного потребления.: -)

1 голос
/ 31 марта 2011

Какое значение $ this-> dbh

Это будет иметь значение по умолчанию, если назначено иначе "null"

Этолокальная переменная для функции select ()?Если это так, то почему функция get () может использовать эту переменную?

Это свойство класса foo, а не локальной переменной, поэтому оно будет доступно для всех методов класса foo

Принадлежит ли он элементу данных класса foo?Если да, то почему в этом классе нет объявления для $ dbh?

Да, оно относится к элементу данных foo, вы не видите никакого объявления, потому что PHP не строго требуетобъявления свойств класса.

0 голосов
/ 31 марта 2011
class foo {
  function select($p1, $dbh=null) {
    if ( is_null($dbh) )
        $this->dbh = $dbh ; 
    return; 
  }

  function get() {
    return $this->dbh; 
  }
}
...