2009-08-14 25 views
6

Me pregunto si los métodos php alguna vez se definen fuera del cuerpo de la clase, ya que a menudo se hacen en C++. Me doy cuenta de que esta pregunta es la misma que Defining class methods in PHP. Pero creo que su pregunta original tenía 'declarar' en lugar de 'definir', por lo que todas las respuestas parecen un poco inapropiadas.Métodos definidos fuera de clase?

Actualización:

Probablemente mi idea de definir y declarar tuvieron fallas. Pero por definir fuera del cuerpo de la clase, me refería a algo equivalente a la de C++

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
}; 

void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

Todos los ejemplos de código PHP tienen el código dentro del cuerpo de la clase como una función inline C++. Incluso si no hubiera diferencia funcional entre los dos en PHP, es solo una cuestión de estilo.

+0

que es más o menos la misma pregunta –

+0

defina la diferencia entre "declarar" y "definir";) – matpie

+0

no sé la respuesta a esta pregunta, pero estoy de acuerdo que el uso incorrecto de * declare * en la otra pregunta hace que sea difícil para mí saber cómo interpretar las respuestas. Las respuestas aquí hasta ahora no lo aclaran. – Darryl

Respuesta

4

Tener la declaración de métodos en los archivos de encabezado separados de su implementación es, que yo sepa, bastante único para C/C++. Todos los demás idiomas que conozco no lo tienen en absoluto, o solo en forma limitada (como interfaces en Java y C#)

0

No. Puede considerar que 'declarar' y 'definir' son intercambiables en esa pregunta.

1

Es posible, pero muy, muy raro y no recomendado. No hay razón para hacerlo tampoco.

1

En primer lugar, en PHP, todos los métodos de clase deben definirse e implementarse dentro de la estructura class (class x { }). No es de ninguna manera como C++ donde tiene las implementaciones (*.cpp) separadas de las definiciones (*.h).

6

Aquí hay un hack terrible, feo, que nunca se debe usar. ¡Pero lo pediste!

class Bar { 
    function __call($name, $args) { 
     call_user_func_array(sprintf('%s_%s', get_class($this), $name), array_merge(array($this), $args)); 
    } 
} 

function Bar_foo($this) { 
    echo sprintf("Simulating %s::foo\n", get_class($this)); 
} 

$bar = new Bar(); 
$bar->foo(); 

¿Qué he hecho? De todos modos, para agregar nuevos métodos, simplemente póngales el nombre de la clase y un guión bajo. El primer argumento para la función es una referencia al $this.

2

Me encontré con esta pregunta mientras buscaba una manera de separar la declaración y la implementación de los métodos de clase. ¿Por qué? Por el bien de la legibilidad del código. Cuando las declaraciones están en un archivo separado, o en la parte superior del archivo de la clase, alguien que busca usar la clase no tiene que recorrer toda la implementación para descubrir qué métodos se ofrecen.

Sí encontré algo útil: clases de interfaz PHP. No creo que estén diseñados para eso, pero sirven al propósito: una clase de interfaz define todos los métodos, y luego la clase "real" los implementa. He aquí un artículo sobre el tema:

http://www.davegardner.me.uk/blog/2010/11/21/why-you-should-always-use-php-interfaces/

1

nativa PHP no es compatible con las características de este tipo, pero desde PHP5.4 se puede añadir de forma dinámica métodos a objetar. A modo de ejemplo, se puede ver en esto: https://github.com/ptrofimov/jslikeobject

Cuestiones relacionadas