Fehlermeldung Strenge Standards: Nicht statische Methoden sollten in PHP nicht statisch aufgerufen werden

114

Ich habe die folgende PHP. Wenn ich jedoch die index.php sehe, erhalte ich die folgende Fehlermeldung.

Strenge Standards: Die nicht statische Methode Page :: getInstanceByName () sollte in /var/www/webworks/index.php in Zeile 12 nicht statisch aufgerufen werden

Ich hoffe, jemand kann mir sagen, wie ich das Problem beheben kann.

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 /grundlagen.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];
    }
Schienbein
quelle
15
Hmm, könnte es sein, dass Sie eine Methode statisch aufrufen und diese Methode nicht als statisch definiert ist? Sie wissen, ziemlich genau, was der Fehler sagt, auf der Zeilennummer steht es ...
Harold1983-

Antworten:

189

Ihren Methoden fehlt das staticSchlüsselwort . Veränderung

function getInstanceByName($name=''){

zu

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

wenn Sie sie statisch aufrufen möchten.

Beachten Sie, dass statische Methoden (und Singletons ) die Testbarkeit beeinträchtigen .

Beachten Sie auch, dass Sie im Konstruktor viel zu viel Arbeit erledigen, insbesondere, dass alle Abfragen nicht vorhanden sein sollten. Alles, was Ihr Konstruktor tun soll, ist, das Objekt in einen gültigen Zustand zu versetzen. Wenn Sie Daten von außerhalb der Klasse benötigen, um dies zu tun, sollten Sie sie injizieren, anstatt sie abzurufen. Beachten Sie auch, dass Konstruktoren nichts zurückgeben können. Sie werden immer ungültig zurückgegeben, sodass alle diese return falseAussagen nichts anderes tun, als die Konstruktion zu beenden.

Gordon
quelle
2
Die Codes stammen aus diesem Buch ... packtpub.com/cms-design-using-php-and-jquery/book . Ich denke, du solltest ein Buch schreiben, Gordon. :-)
Shin
5
@shin Nein, ich würde nur wiederholen, was andere besser gesagt haben als ich zuvor. Aber das ist ein wirklich schlechter Code für ein Buch, das im Dezember 2010 veröffentlicht wurde. Geben sie einen Grund an, Sichtbarkeitsschlüsselwörter wegzulassen oder die PEAR-Codierungskonvention nicht zu befolgen? Hoffen wir, dass die jQuery- und allgemeine CMS-Architektur solider ist.
Gordon
17
@dzona, die die Probleme mit dem Code ignorieren und nicht beheben würde.
Gordon
1
Wichtig HINWEIS: Das publicSchlüsselwort wird nur in Funktions- / Variablendeklarationen innerhalb einer Klasse verwendet. Siehe stackoverflow.com/questions/13341378/…
cssyphus
1
@ Gordon, nur neugierig - warum befürworten Sie, die beleidigende Methode zu ändern static, anstatt den zu verwendenden Code (neu) zu schreiben $p = new Page(); $p->getInstanceByName();?
Dennis
21

Ich denke, das könnte Ihre Frage beantworten.

Nicht statische Methode ..... sollte nicht statisch aufgerufen werden

Wenn die Methode nicht statisch ist, müssen Sie sie wie folgt initialisieren:

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

In PHP 5.4+ können Sie diese Syntax verwenden:

(new ClassName)->method();
Erbse
quelle
Is (neuer Klassenname) -> method (); auch kompatibel mit PHP 5.3?
Jeff
1
@ Jeff, ich würde verwenden (new ClassName())->method();, und ich glaube, es ist kompatibel mit PHP von 5 bis 7
Dennis
1
(new ClassName)->method();ist nicht kompatibel mit PHP 5.3. Ich habe es gerade versucht.
Sonny
1

Versuche dies:

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

In einem ähnlichen Fall hat es bei mir funktioniert.

Andrés Frías
quelle
1

benutze className-> function (); stattdessen className :: function ();

ulas korpe
quelle
0

return falseist normalerweise dazu gedacht, die Objekterstellung mit einem Fehler zu beenden. So einfach ist das.

Tomas
quelle
0

Wenn die Bereichsauflösung :: außerhalb der Klasse verwendet werden musste, sollte die entsprechende Funktion oder Variable als statisch deklariert werden

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();
Ravi Krishnan
quelle
1
Können Sie Beispiele für das OP und alle zukünftigen Besucher liefern?
B001
<? php class Foo {/ * Statische Variable * / public static $ static_var = 'statische Variable'; / * Statische Funktion * / statische Funktion staticValue () {return 'statische Funktion'; } / * function * / function Value () {return 'Object'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = new Foo (); echo $ foo-> Value (); / * Hoffe, dieses Beispiel hilft Ihnen * /
Ravi Krishnan
-1

Anstatt die Instanz mit dem Bereichsauflösungsoperator :: zu verwenden, weil sie nicht als statische Funktion definiert wurde.

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

ändere es in:

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

Und es wird wie ein Zauber wirken.

Lorand
quelle