2012-05-26 18 views
25

Actualmente el uso de una gran plataforma en PHP¿Cómo puedo resolver "método xxx no estático: xxx() no debería ser llamado estáticamente en PHP 5.4

El servidor está alojado en recientemente se ha actualizado a PHP 5.4?. .

Dado que, he recibido muchos mensajes de error como:

[SAT pueda 19:04:41 26 de 2012] [error] estrictos estándares de PHP: método no estático Config :: getData() no debe llamarse estáticamente, asumiendo $ this desde un contexto incompatible en /xxx/Config.inc.php en la línea 35

El ejemplo de método se define como (nota la falta de palabra clave 'estática'):

function &getData() { 
      $configData =& Registry::get('configData', true, null); 

    if ($configData === null) { 
     // Load configuration data only once per request, implicitly 
     // sets config data by ref in the registry. 
     $configData = Config::reloadData(); 
    } 

    return $configData; 
} 

Esto no causó un problema antes, y supongo que los mensajes de error (que causan la aplicación se bloquee) puede estar relacionado con la actualización reciente a PHP5.4.

¿Existe una configuración de PHP que pueda modificar para 'ignorar' la falta de palabra clave estática?

+0

Crea una instancia de Config y llama a getData() desde ella – Musa

+0

¿Podrías incluir una muestra del contenido de '& getData()'? Específicamente, qué es exactamente lo que se devuelve y cómo. –

+0

Agregué el contenido de & getData() a la pregunta original - Debo enfatizar que este error solo se ha presentado desde la actualización a 5.4, así que estoy seguro de que la lógica es buena – kaese

Respuesta

39

Puede eliminar E_STRICT de error_reporting(), o simplemente puede hacer que su método sea estático, si necesita llamarlo estáticamente. Hasta donde yo sé, no hay una forma (estricta) de tener un método que pueda invocarse como método estático y no estático. Además, lo que es más molesto, no puede tener dos métodos con el mismo nombre, uno es estático y el otro no estático.

+0

Gracias languidez - esa es mi idea también. Dudo en hacerlos puramente estáticos porque no estoy seguro de que los llamen desde un contexto no estático también. Intentaré eliminar E_STRICT de error_reporting() y te responderé. Gracias. – kaese

+0

Con su implementación getData(), no habría necesidad de llamar en contexto no estático, ya que no manipula datos de instancia de ninguna manera; y si funcionó con datos de instancia, no podrá llamarlo en contexto estático. – lanzz

+0

Gracias lanzz - sin embargo, hay otros métodos lanzando la misma advertencia que puede llamarse de forma no estática. Su sugerencia de simplemente desactivar los errores estrictos en error_reporting() parece haber reprimido el problema. ¡Gracias! – kaese

-5

He resuelto esto con una sola línea de código, de la siguiente manera: En archivo index.php, en la raíz de su plantilla, después de esta línea de código:

define ('_JEXEC') or die ('Acceso restringido') ;

pegue esta línea: ini_set ('display_errors', 'Off');

No se preocupe, sea feliz ...

publicados por Jenio.

+3

Esto ocultará todos los errores. Es una buena idea no mostrar errores al usuario por consideraciones de seguridad, sin embargo, es posible que aún aparezcan en los archivos de registro o durante el desarrollo. Otros problemas reales pueden pasar desapercibidos con este enfoque. – amoebe

+0

Esto no resolverá ningún problema y hará que otros problemas sean más difíciles de detectar. –

+0

En un sitio web ocupado, puede tener 100s de MB de datos de registro (archivo 'error_log') todos los días si simplemente no los muestra (en el archivo HTML/al cliente) pero todavía los habilita (sea' E_STRICT' en PHP) Me pasó a mí también. – Ned64

23

Desactivar el mensaje de alerta no es una forma de resolver el problema. A pesar de que el núcleo PHP continúa funcionando, realiza suposiciones y acciones peligrosas.

Nunca ignore el error donde PHP debe hacer suposiciones de algo !!!!

Si la clase organizada como un conjunto unitario que siempre se puede utilizar la función de getInstance() y luego usar getData()

Likse:

$classObj = MyClass::getInstance(); 
$classObj->getData(); 

Si la clase no es un producto único, el uso

$classObj = new MyClass(); 
$classObj->getData(); 
4

No sugiero que solo oculte los errores de stricts en su proyecto. Intead, usted debe dar vuelta a su método de estática o probar para conformar una nueva instancia del objeto:

$var = new YourClass(); 
$var->method(); 

También puede utilizar la nueva forma de hacer lo mismo a partir de PHP 5.4:

(new YourClass)->method(); 

¡Espero que te ayude!

Cuestiones relacionadas