2011-03-31 17 views
26

estoy leyendo algo de código PHP que yo no podía entender:

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

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

no puedo encontrar $this->dbh ($dbh) declaración de la clase. Mis preguntas son:

  • ¿Cuál es el valor de $this->dbh?

  • ¿Es una variable local para la función select()?

  • ¿$this pertenece al miembro de datos de class foo? ¿Por qué no hay una declaración para $dbh en esta clase?

+1

A menos que no haya incluido código que define '$ dbh' para la clase, o una clase que se extiende , este código no hace nada. Lo que dijo @Unsigned es verdadero: si se hace referencia a una propiedad que no existe, se crea silenciosamente. En ese caso, sin embargo, este código SIEMPRE devuelve nulo. SIEMPRE. '$ this-> dbh' nunca se establece, solo se usa para establecer otras variables, lo que significa que no importa lo que hagas,' get() 'SIEMPRE devolverá nulo. Creo que quizás has omitido algún código pertinente, o la persona que escribió esto es completamente loca. – rockerest

+0

Es solo una clase, creo que para responder a sus preguntas, debemos tener un código más, donde declare el objeto de esta clase –

Respuesta

18

PHP no es estricto sobre la exigencia de declaraciones de propiedades de clase.

  • Al asignación, la propiedad se crea en silencio.
  • Lectura de una propiedad inexistente genera un Aviso si E_STRICT está habilitado.
  • El valor por defecto para cualquier propiedad no definida es NULL
+5

A los 3 downvoters ... ¿qué? – Unsigned

+0

... y este es un comportamiento terrible de Php (puede ser útil a veces, pero ...) Por lo tanto, eche un vistazo a Nette \ Object, que hace que Php sea un lenguaje más sano http://doc.nette.org/en /2.2/php-language-enhancements – jasir

+1

@jasir ¡Suena casi como publicidad propia! :> Casi _every_ framework PHP hace que PHP tenga un lenguaje más sano. Ese es el objetivo principal de escribir marcos, después de todo. ¿Podrías nombrar _al menos una_ estructura PHP, que no fue creada para borrar un poco de locura PHP pura? ¿O eso no tiene este objetivo como una de las principales razones? – trejder

2
  1. Con el código que has enviado, no se puede saber cuáles son los valores de $this->dbh es.
  2. $dbh es una propiedad del objeto actual. $this se usa para acceder a los miembros del objeto actual.
  3. Dado que esta variable se define fuera de cualquier función, es una variable que pertenece a la clase y no a una función específica. Debido a esto, $this->dbh se puede usar en cualquier función dentro de la clase.
  4. PHP no necesita definir cada variable que utiliza.
+2

Tenga cuidado con su '$ dbh' contra' $ this-> dbh'. Son variables completamente diferentes. Lo que dijiste:> "' $ dbh' se puede usar en cualquier función dentro de la clase "es realmente incorrecto. '$ this-> dbh' se puede usar en cualquier función, si se ha configurado en alguna parte. '$ dbh' es una variable local como cualquier otra. – rockerest

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

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

¿Cuál es el valor de $ this-> dap

Tendrá el valor por defecto, si se ha asignado otro "nulo"

¿Es un local de variable para seleccionar la función()? Si es así, ¿por qué la función get() puede usar esta variable?

Es la propiedad de la clase Foo, no la variable local, por lo que estará disponible para todos los métodos de la clase foo

Hace pertenece miembro de datos de la clase foo? Si es así, ¿por qué no hay una declaración para $ dbh en esta clase?

Sí, pertenece al miembro de datos de foo, no ve ninguna declaración porque, PHP no es estricto sobre la exigencia de declaraciones de propiedades de clase.

1

PHP no lo obliga a declarar las propiedades de clase, pero las creará cuando lo acceda por primera vez. Si esto es bueno o malo, sea como sea, bienvenido a PHP.

Otra cosa que debes comprobar es que no tienes herencia. ¿Fue su propiedad $dbh definida en una clase para padres? No hay nada en el código simple que publicaste, pero me imagino que simplificaste un poco para el consumo público. :-)

+0

No es una clase heredada. Estoy seguro. – wordpressquestion

22

PHP no es estricto para la declaración. $ this-> dbh es un miembro de la clase. Hice el código siguiente para entender el concepto:

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; 
} 

} 

Es igual a:

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

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

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

} 
+2

Genial, me alegro de que lo tengas :) – Unsigned

+3

explicación sólida +1 :) –