2012-02-09 28 views
15

¿Por qué en PHP puede acceder al método estático a través de una instancia de alguna clase pero no solo a través del nombre de tipo?Métodos estáticos en PHP

ACTUALIZACIÓN: soy desarrollador de .net pero también trabajo con desarrolladores de php. Recientemente he encontrado este momento sobre métodos estáticos llamados desde instancia y no puedo entender por qué puede ser útil.

Ejemplo:

class Foo 
{ 
    public static Bar() 
    { 
    } 
} 

podemos aceptar método como este:

var $foo = new Foo(); 
$foo.Bar(); // ?????? 
+4

métodos y propiedades estáticas son un poco difícil al principio. Todo lo que necesita recordar es que un método o propiedad estática se puede usar sin crear una instancia del objeto primero. – EGHDK

+0

¿Puedes aclarar qué quieres decir con un fragmento de código? Tu pregunta es un tanto ambigua. – deceze

+0

Esto no es específico de PHP. En Python también puede acceder a los métodos decorados con decoradores '@ staticmethod' de la instancia, y la única diferencia es que los métodos estáticos no reciben el contexto (objeto) en el que se llaman. – Tadeck

Respuesta

24

En PHP

la clase se instancia utilizando la nueva palabra clave, por ejemplo;

$MyClass = new MyClass();

y el método o propiedades estáticas pueden visitada utilizando cualquiera operador de resolución de alcance o el operador de referencia de objeto. por ejemplo, si la clase MyClass contiene el método estático Foo(), entonces puede acceder a ella de cualquier manera.

$MyClass->Foo(); Or MyClass::Foo()

La única regla es que los métodos o propiedades estáticas están fuera de contexto del objeto. por ejemplo, no puede usar $this dentro de un método estático.

+1

Aunque usando instancia también funciona: '$ class-> staticMethod()' – dmitry

+5

@Ibrahim - En realidad, eso es incorrecto.Puede acceder a métodos estáticos y no estáticos desde una instancia de la clase o la clase misma. La única vez que obtendrá un error es cuando llama a un método que hace referencia a '$ this' estáticamente. –

+1

@ confused-demon nunca supo PHP permitió esto, gracias :) –

3

¿Por qué en PHP puede acceder al método estático a través de una instancia de alguna clase, pero no solo a través del nombre del tipo?

A diferencia de lo que probablemente estés acostumbrado con .NET, PHP tiene tipos dinámicos. Consideremos:

class Foo 
{ 
    static public function staticMethod() { } 
} 

class Bar 
{ 
    static public function staticMethod() { } 
} 

function doSomething($obj) 
{ 
    // What type is $obj? We don't care. 
    $obj->staticMethod(); 
} 

doSomething(new Foo()); 
doSomething(new Bar()); 

Así, al permitir el acceso a los métodos estáticos a través de la instancia del objeto, puede llamar más fácilmente una función estática del mismo nombre a través de diferentes tipos.

Ahora no sé si hay un buen motivo para acceder al método estático a través del ->. PHP (5.3?) También es compatible con:

$obj::staticMethod(); 

que es tal vez menos confuso. Cuando se usa ::, debe ser una función estática para evitar advertencias (a diferencia de ->, que permite cualquiera).

+0

quizás los métodos no estáticos con una interfaz deberían usarse en su ejemplo, porque tal uso de métodos estáticos es un poco confuso ¿No es así? – donRumatta

+0

@donRumatta, no afirmaría que lo anterior es un buen código. Pero debido a las características dinámicas de PHP, las interfaces no son estrictamente necesarias, y muchas personas codifican sin ellas. Tenga en cuenta que PHP no siempre tiene una buena compatibilidad con OOP, por lo que algunas de las respuestas al "por qué" son simplemente "malas decisiones de diseño de versiones anteriores". – Matthew

11
Class Do { 
    static public function test() { 
     return 0; 
    } 
} 

uso como esto:

echo Do::test();