Mensaje de error Estándares estrictos: el método no estático no debe llamarse estáticamente en php

5 minutos de lectura

Mensaje de error Estandares estrictos el metodo no estatico no
espinilla

Tengo el siguiente php. Sin embargo, cuando veo index.php, aparece el siguiente mensaje de error.

Estándares estrictos: el método no estático Page::getInstanceByName() no debe llamarse estáticamente en /var/www/webworks/index.php en la línea 12

Espero que alguien me pueda decir como solucionar el problema.

índice.php

// { common variables and functions
include_once('ww.incs/common.php');
$page=isset($_REQUEST['page'])?$_REQUEST['page']:'';
$id=isset($_REQUEST['id'])?(int)$_REQUEST['id']:0;
...

// { get current page id
if(!$id){
    if($page){ // load by name
        $r=Page::getInstanceByName($page);
        if($r && isset($r->id))$id=$r->id;
    }
    if(!$id){ // else load by special
        $special=1;
        if(!$page){
            $r=Page::getInstanceBySpecial($special);
            if($r && isset($r->id))$id=$r->id;
        }
    }
}

// { load page data
if($id){
    $PAGEDATA=(isset($r) && $r)?$r : Page::getInstance($id);
}
else{
    echo '404 thing goes here';
    exit;
}
...
...

ww.incs/common.php

<?php
require dirname(__FILE__).'/basics.php';
...
...

ww.incs/basics.php

session_start();
if(!function_exists('__autoload')){
    function __autoload($name) {
        require $name . '.php';
    }
}
...
...

Página.php

class Page{
    static $instances             = array();
    static $instancesByName     = array();
    static $instancesBySpecial   = array();
    function __construct($v,$byField=0,$fromRow=0,$pvq=0){
        # byField: 0=ID; 1=Name; 3=special
        if (!$byField && is_numeric($v)){ // by ID
            $r=$fromRow?$fromRow:($v?dbRow("select * from pages where id=$v limit 1"):array());
        }
        else if ($byField == 1){ // by name
            $name=strtolower(str_replace('-','_',$v));
            $fname="page_by_name_".md5($name);
            $r=dbRow("select * from pages where name like '".addslashes($name)."' limit 1");
        }
        else if ($byField == 3 && is_numeric($v)){ // by special
            $fname="page_by_special_".$v;
            $r=dbRow("select * from pages where special&$v limit 1");
        }
        else return false;
        if(!count($r || !is_array($r)))return false;
        if(!isset($r['id']))$r['id']=0;
        if(!isset($r['type']))$r['type']=0;
        if(!isset($r['special']))$r['special']=0;
        if(!isset($r['name']))$r['name']='NO NAME SUPPLIED';
        foreach ($r as $k=>$v) $this->{$k}=$v;
        $this->urlname=$r['name'];
        $this->dbVals=$r;
        self::$instances[$this->id] =& $this;
        self::$instancesByName[preg_replace('/[^a-z0-9]/','-',strtolower($this->urlname))] =& $this;
        self::$instancesBySpecial[$this->special] =& $this;
        if(!$this->vars)$this->vars="{}";
        $this->vars=json_decode($this->vars);
    }
    function getInstance($id=0,$fromRow=false,$pvq=false){
        if (!is_numeric($id)) return false;
        if (!@array_key_exists($id,self::$instances)) self::$instances[$id]=new Page($id,0,$fromRow,$pvq);
        return self::$instances[$id];
    }
    function getInstanceByName($name=""){
        $name=strtolower($name);
        $nameIndex=preg_replace('#[^a-z0-9/]#','-',$name);
        if(@array_key_exists($nameIndex,self::$instancesByName))return self::$instancesByName[$nameIndex];
        self::$instancesByName[$nameIndex]=new Page($name,1);
        return self::$instancesByName[$nameIndex];
    }
    function getInstanceBySpecial($sp=0){
        if (!is_numeric($sp)) return false;
        if (!@array_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
        return $instancesBySpecial[$sp];
    }

  • Hmm, ¿podría ser que estás llamando a un método de forma estática y ese método no está definido como estático? Ya sabes, más o menos exactamente lo que dice el error, en el número de línea que dice…

    – Harold1983-

    13 de enero de 2011 a las 19:48

1646759586 585 Mensaje de error Estandares estrictos el metodo no estatico no
gordon

A sus métodos les falta el static palabra clave. Cambiar

function getInstanceByName($name=""){

para

public static function getInstanceByName($name=""){

si quieres llamarlos estáticamente.

Tenga en cuenta que los métodos estáticos (y Singletons) son muerte a la comprobabilidad.

También tenga en cuenta que está haciendo demasiado trabajo en el constructor, especialmente todas las consultas no deberían estar allí. Todo lo que se supone que debe hacer su constructor es establecer el objeto en un estado válido. Si tiene que tener datos de fuera de la clase para hacerlo, considere inyectarlos en lugar de extraerlos. También tenga en cuenta que los constructores no pueden devolver nada. Siempre volverán vacíos, así que todos estos return false Las declaraciones no hacen más que terminar la construcción.

  • Los códigos son de este libro…packtpub.com/cms-design-using-php-and-jquery/book. Creo que deberías escribir un libro, Gordon. 🙂

    – espinilla

    13/01/2011 a las 20:00

  • @shin Nah, solo repetiría lo que otros han dicho mejor que yo antes. Pero ese es un código realmente malo para un libro que se publicó en diciembre de 2010. ¿Dan alguna razón para omitir palabras clave de visibilidad o no seguir la convención de codificación PEAR? Esperemos que jQuery y la arquitectura general del CMS sean más sólidas.

    – Gordon

    13 de enero de 2011 a las 20:26

  • @dzona eso sería ignorar los problemas con el código, no arreglarlo.

    – Gordon

    4 de diciembre de 2013 a las 6:10

  • NOTA importante: la public La palabra clave se usa solo en declaraciones de función/variable desde dentro de una clase. Ver stackoverflow.com/questions/13341378/…

    – csifo

    6 de febrero de 2015 a las 18:17


  • @Gordon, solo curiosidad: ¿por qué aboga por cambiar el método ofensivo a staticen lugar de (re)escribir el código para usar $p = new Page(); $p->getInstanceByName();?

    -Dennis

    13/07/2016 a las 18:35


1646759587 636 Mensaje de error Estandares estrictos el metodo no estatico no
Guisante

Creo que esto puede responder a tu pregunta.

Método no estático ….. no debe llamarse estáticamente

Si el método no es estático, debe inicializarlo así:

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

O, en PHP 5.4+, puede usar esta sintaxis:

(new ClassName)->method();

  • Es (nuevo nombre de clase)->método(); compatible con PHP 5.3 también?

    – Jeff

    22 de marzo de 2016 a las 1:20


  • @Jeff, yo usaría (new ClassName())->method();y creo que es compatible con PHP de 5 a 7

    -Dennis

    13/07/2016 a las 20:01

  • (new ClassName)->method(); no es compatible con PHP 5.3. Lo acabo de probar.

    – hijo

    24 de enero de 2017 a las 16:13


1646759588 97 Mensaje de error Estandares estrictos el metodo no estatico no
ravi krishnan

Si la resolución de alcance :: tuvo que usarse fuera de la clase, entonces la función o variable respectiva debe declararse como estática

class Foo { 
        //Static variable 
        public static $static_var="static variable"; 
        //Static function 
        static function staticValue() { return 'static function'; } 

        //function 
        function Value() { return 'Object'; } 
} 



 echo Foo::$static_var . "<br/>"; echo Foo::staticValue(). "<br/>"; $foo = new Foo(); echo $foo->Value();

  • ¿Puede proporcionar ejemplos para el OP y todos los futuros visitantes?

    – B001ᛦ

    23 de agosto de 2016 a las 11:47

  • “; echo Foo::staticValue(). “
    “; $foo = new Foo(); echo $foo->Valor(); /*Espero que este ejemplo te ayude*/

    – Ravi Krishnan

    23 de agosto de 2016 a las 13:08


Mensaje de error Estandares estrictos el metodo no estatico no
andres frias

Prueba esto:

$r = Page()->getInstanceByName($page);

Me funcionó en un caso similar.

use className->función(); en su lugar className::function() ;

1646759589 714 Mensaje de error Estandares estrictos el metodo no estatico no
bo persona

return false generalmente está destinado a terminar la creación del objeto con una falla. Es tan simple como eso.

1646759590 854 Mensaje de error Estandares estrictos el metodo no estatico no
Rashwan L.

En lugar de usar la instancia con el operador de resolución de alcance :: porque no se definió como función estática.

$r=Page::getInstanceByName($page);

cambiarlo a:

$r=Page->getInstanceByName($page);

Y funcionará a las mil maravillas.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad