2012-02-21 5 views
7

Tengo una cadena que contiene el nombre de clase y deseo obtener una constante y llamar a un método (estático) de esa clase.Constante de clase de acceso y método estático de la serie

<?php 
$myclass = 'b'; // My class I wish to use 

$x = new x($myclass); // Create an instance of x 
$response = $x->runMethod(); // Call "runMethod" which calls my desired method 

// This is my class I use to access the other classes 
class x { 
    private $myclass = NULL; 

    public function __construct ($myclass) { 
     if(is_string($myclass)) { 
      // Assuming the input has a valid class name 
      $this->myclass = $myclass; 
     } 
    } 

    public function runMethod() { 
     // Get the selected constant here 
     print $this->myclass::CONSTANT; 

     // Call the selected method here 
     return $this->myclass::method('input string'); 
    } 
} 


// These are my class(es) I want to access 
abstract class a { 
    const CONSTANT = 'this is my constant'; 

    public static function method ($str) { 
     return $str; 
    } 
} 

class b extends a { 
    const CONSTANT = 'this is my new constant'; 

    public static function method ($str) { 
     return 'this is my method, and this is my string: '. $str; 
    } 
} 
?> 

como esperaba (más o menos), utilizando $variable::CONSTANT$variable::method(); o no funciona.

Antes de preguntar qué he intentado; He intentado tantas cosas que básicamente olvidé.

¿Cuál es el mejor enfoque para hacer esto? Gracias por adelantado.

Respuesta

22

Para acceder a la constante, utilice constant():

constant($this->myClass.'::CONSTANT'); 

Ser informado: Si está trabajando con espacios de nombres, es necesario agregar específicamente el espacio de nombres de la cadena, incluso si se llama constant() desde el mismo espacio de nombres !

Para la llamada, usted tiene que utilizar call_user_func():

call_user_func(array($this->myclass, 'method')); 

Sin embargo: todo esto no es muy eficiente, por lo que es posible que desee echar otro vistazo a su diseño jerarquía de objetos. Puede haber una forma mejor de lograr el resultado deseado, utilizando la herencia, etc.

+0

Y qué pasa con el método? –

+0

¡Ha actualizado la respuesta! – Rijk

+0

Pow! Respuesta rápida y fácil que funcionó como un encanto. ¡Gracias! –

1

Puede lograrlo configurando una variable temporal. No es la manera más elegante, pero funciona.

public function runMethod() { 
    // Temporary variable 
    $myclass = $this->myclass; 
    // Get the selected constant here 
    print $myclass::CONSTANT; 

    // Call the selected method here 
    return $myclass::method('input string'); 
} 

supongo que tiene que ver con la ambigüedad de la ::, al menos que lo que el mensaje de error está insinuando (PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM)

+1

Solo quería escribir la misma respuesta.Esta sería la versión más "sensata", creo. Aunque una reescritura completa con la herencia sería mucho mejor. – apfelbox

2

Uso call_user_func llamar al método estático:

call_user_func(array($className, $methodName), $parameter); 
1

Las clases definidas como abstractas no se pueden instanciar, y cualquier clase que contenga al menos un método abstracto también debe ser abstracta. Los métodos definidos como abstractos simplemente declaran la firma del método; no pueden definir la implementación.

Al heredar de una clase abstracta, todos los métodos marcados como abstract en la declaración de clase del padre deben ser definidos por el niño; adicionalmente, estos métodos deben definirse con la misma (o menos restringida) visibilidad. Por ejemplo, si el método abstracto se define como protegido, la implementación de la función debe definirse como protegida o pública, pero no privada. Además, las firmas de los métodos deben coincidir, es decir, las sugerencias de tipo y el número de argumentos requeridos deben ser iguales. Esto también se aplica a los constructores a partir de PHP 5.4. Antes 5.4 las firmas de constructor pueden diferir. Consulte la http://php.net/manual/en/language.oop5.abstract.php

0

en php 7 puede utilizar el código

echo 'my class name'::$b; 
+1

Si bien esta respuesta puede resolver el problema del OP, se recomienda que proporcione una explicación clara de cómo se logra la solución. Simplemente publicar respuestas de solo código puede ser inútil para el OP y los futuros usuarios. Por favor elabora. –

+1

solución está clara! porque el título de la pregunta es ** Constante de la clase de acceso y método estático de la cadena ** –

Cuestiones relacionadas