Llamando al método de clase desde la cadena almacenada como miembro de la clase

$_auto llamar a un método almacenado como $_auto , pero no funcionará.

 _auto = "index"; $this->_auto(); } public function index() { echo "index"; } } $index = new Index(); ?> 

Necesita usar call_user_func para hacer esto:

 call_user_func(array($this, $this->_auto)); 

Desafortunadamente, PHP no le permite usar directamente los valores de propiedad como callables .

También hay un truco que puede usar para invocar automáticamente callables como este. No estoy seguro de que lo respalde, pero aquí está. Agregue esta implementación de __call a su clase:

  public function __call($name, $args) { if (isset($this->$name) && is_callable($this->$name)) { return call_user_func_array($this->$name, $args); } else { throw new \Exception("No such callable $name!"); } } 

Esto le permitirá invocar callables, para que pueda llamar a funciones gratuitas:

  $this->_auto = 'phpinfo'; $this->_auto(); 

Y métodos de clase:

  $this->_auto = array($this, 'index'); $this->_auto(); 

Y, por supuesto, puede personalizar este comportamiento modificando lo que invoca __call .

Tu código está intentando llamar a un método llamado “_auto”. Para hacer lo que está preguntando, quiere hacer que el nombre del método sea una variable php o algo similar a lo que dicen los otros carteles.

 class Foo { private function _auto() { echo "index"; } public function callmethod($method) { $this->$method(); } } $foo = new Foo(); $foo->callmethod('_auto'); 

No tiene un método llamado _auto() , solo tiene una propiedad llamada $_auto . Si su intención es llamar a un método indefinido para devolver una propiedad con un nombre similar si existe, entonces tendría que escribir un método mágico __call() para realizar la lógica de buscar una propiedad con un nombre similar y devolver el valor. Entonces algo como esto debería ser agregado a tu clase:

 public function __call($called_method, $arguments) { if(property_exists($this, $called_method)) { return $this->{$called_method}; } else { throw new Exception('Illegal method call.'); } } 

Creo que definiste erróneamente “_auto” como una propiedad.

Intenta usar:

 private function _auto(){} 

En lugar de

 private $_auto