tipos que objetos objeto metodos example ejemplos clases php class

objetos - que es un objeto en php



Definición de métodos de clase en PHP (8)

C ++ tampoco puede hacer esto. ¿ Confundiste la declaración con la definición ?

¿Es posible en PHP (as it is in C++) declarar un class method FUERA de la class definition? la class definition?


No, como todos han dicho, no es estrictamente posible.

Sin embargo, puedes hacer algo como esto para emular un mixin en PHP o agregar métodos a una clase en tiempo de ejecución, que es lo más parecido que obtendrás. Básicamente, solo usa patrones de diseño para lograr la misma funcionalidad. Zope 3 hace algo similar para emular mixins en Python, otro lenguaje que no los admite directamente.


No, no es posible si define la función / método fuera de la construcción de clase, se convierte en función global.


No.

Sin embargo, puede extender las clases declaradas anteriormente, si eso ayuda.


Sí, es posible agregar un método a una clase PHP después de que se haya definido. Desea utilizar classkit , que es una extensión "experimental". Parece que esta extensión no está habilitada por defecto, por lo que depende de si puede compilar un archivo binario PHP personalizado o cargar archivos DLL PHP si está en Windows (por ejemplo, Dreamhost permite binarios PHP personalizados, y son bastante fáciles de configurar )

<?php class A { } classkit_method_add(''A'', ''bar'', ''$message'', ''echo $message;'', CLASSKIT_ACC_PUBLIC); $a = new A(); $a->bar(''Hello world!'');

Ejemplo del manual de PHP:

<?php class Example { function foo() { echo "foo!/n"; } } // create an Example object $e = new Example(); // Add a new public method classkit_method_add( ''Example'', ''add'', ''$num1, $num2'', ''return $num1 + $num2;'', CLASSKIT_ACC_PUBLIC ); // add 12 + 4 echo $e->add(12, 4);


Como PHP 5.3 admite cierres, puede definir dinámicamente métodos de instancia como variables que contienen cierres:

$class->foo = function (&$self, $n) { print "Current /$var: " . $self->var . "/n"; $self->var += $n; print "New /$var: " .$self->var . "/n"; };

Si toma $self (no puede usar $this external context) como referencia ( & ), puede modificar la instancia.

Sin embargo, los problemas ocurren cuando intentas llamar a la función normalmente:

$class->foo(2);

Usted obtiene un error fatal. PHP piensa que foo es un método de $class , debido a la sintaxis. Además, debe pasar la instancia como primer argumento.

Afortunadamente hay una función especial para llamar funciones por nombre llamada call_user_func :

call_user_func($class->foo, &$class, 2); # => Current $var: 0 # => New $var: 2

Solo recuerde poner & antes de la variable de instancia.

Lo que es aún más fácil es si usas el método mágico __call :

class MyClass { public function __call ($method, $arguments) { if (isset($this->$method)) { call_user_func_array($this->$method, array_merge(array(&$this), $arguments)); } } }

Ahora puede llamar a $class->foo(2) lugar. El método mágico __call capta la llamada a un método desconocido y llama al cierre en la variable $class->foo con el mismo nombre que el método llamado.

Por supuesto, si $class->var era privado, el cierre almacenado en la variable $class->foo no podría acceder a él.


Tal vez podría anular __call o __callStatic para localizar un método que faltaba en el tiempo de ejecución, pero tendría que crear su propio sistema para localizar y llamar al código. Por ejemplo, puede cargar una clase "Delegar" para manejar la llamada al método.

Aquí hay un ejemplo: si intentas llamar a $ foo-> bar (), la clase intentará crear una clase FooDelegate_bar y invocar a bar () sobre ella con los mismos argumentos. Si tienes configurada la carga automática de la clase, el delegado puede vivir en un archivo separado hasta que sea necesario ...

class Foo { public function __call($method, $args) { $delegate="FooDelegate_".$method; if (class_exists($delegate)) { $handler=new $delegate($this); return call_user_func_array(array(&$handler, $method), $args); } } }


No, a partir de PHP 5.2. Sin embargo, puede usar el método mágico __call para reenviar la llamada a una función o método arbitrario.

class A { public function __call($method, $args) { if ($method == ''foo'') { return call_user_func_array(''bar'', $args); } } } function bar($x) { echo $x; } $a = new A(); $a->foo(''12345''); // will result in calling bar(''12345'')

En PHP 5.4 hay soporte para rasgos . El rasgo es una implementación de método (s) que no se pueden instanciar como objeto independiente. En cambio, el rasgo se puede usar para extender la clase con la implementación contenida. Aprenda más sobre los Rasgos aquí .