web-dev-qa-db-fra.com

Message d'erreur Normes strictes: Une méthode non statique ne doit pas être appelée de manière statique dans php

J'ai le php suivant. Cependant, lorsque je vois le fichier index.php, le message d'erreur suivant s'affiche.

Normes strictes: la méthode non statique Page :: getInstanceByName () ne doit pas être appelée de manière statique dans /var/www/webworks/index.php à la ligne 12

J'espère que quelqu'un pourra me dire comment résoudre le problème.

Merci d'avance.

index.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';
    }
}
...
...

Page.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];
    }
108
shin

Il manque à votre méthode static mot-clé . Changement

function getInstanceByName($name=''){

à

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

si vous voulez les appeler statiquement.

Notez que les méthodes statiques (et Singletons ) sont mort à testabilité .

Notez également que vous travaillez beaucoup trop dans le constructeur, en particulier toutes les requêtes ne devraient pas y figurer. Tout ce que votre constructeur est censé faire est de définir l'objet dans un état valide. Si vous devez disposer de données extérieures à la classe, envisagez de les injecter au lieu de les extraire. Notez également que les constructeurs ne peuvent rien retourner. Ils retourneront toujours nuls afin que toutes ces déclarations return false ne finissent que la fin de la construction.

182
Gordon

Je pense que cela peut répondre à votre question.

La méthode non statique ..... ne devrait pas être appelée de manière statique

Si la méthode n'est pas statique, vous devez l'initialiser de la manière suivante:

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

Ou, dans PHP 5.4, vous pouvez utiliser cette syntaxe:

(new ClassName)->method();
17
Pea

Essaye ça:

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

Cela a fonctionné pour moi dans un cas similaire.

1
Andrés Frías

utilisez className-> function (); à la place className :: function ();

0
ulas korpe

return false est généralement destiné à mettre fin à la création de l'objet avec un échec. C'est aussi simple que ça.

0
Tomas

Si scope resolution :: doit être utilisé en dehors de la classe, la fonction ou la variable correspondante doit être déclarée comme statique

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();
0
Ravi Krishnan