2011-01-13 6 views
95

aufgerufen werden Ich habe die folgenden PHP. Wenn ich jedoch die index.php sehe, erhalte ich die folgende Fehlermeldung.Fehlermeldung Strenge Standards: Nicht statische Methode sollte nicht statisch in PHP

strenge Maßstäbe: Nicht-statische Methode Seite :: getInstanceByName() sollte nicht statisch in /var/www/webworks/index.php on line 12

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

Vielen Dank im Voraus.

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 ([email protected]_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 ([email protected]_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3); 
     return $instancesBySpecial[$sp]; 
    } 
+14

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, die es sagt ... –

+3

Dank dieser Frage konnte ich eine Lösung für mein Problem finden – Bolas

Antwort

158

Ihre Methoden fehlen die static keyword. Ändern

function getInstanceByName($name=''){ 

zu

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

, wenn Sie wollen, statisch nennen.

Beachten Sie, dass statische Methoden (und Singletons) death to testability sind.

Beachten Sie auch, dass Sie viel zu viel Arbeit im Konstruktor tun, vor allem alle Abfragen sollten nicht dort sein. Alles, was Ihr Konstruktor tun soll, setzt das Objekt in einen gültigen Zustand. Wenn Sie Daten von außerhalb der Klasse haben müssen, um dies zu tun, ziehen Sie es in Betracht, anstatt es zu ziehen. Beachten Sie auch, dass Konstruktoren nichts zurückgeben können. Sie werden immer void zurückgeben, so dass all diese return false Aussagen nichts anderes tun, als die Konstruktion zu beenden.

+0

Vielen Dank Gordon. – shin

+1

Die Codes stammen aus diesem Buch ... https: //www.packtpub.com/cms-design-using-php-and-jquery/book. Ich denke, du solltest ein Buch schreiben, Gordon. :-) – shin

+4

@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. Gibt es irgendeinen Grund dafür, irgendwelche Sichtbarkeitsschlüsselwörter wegzulassen oder nicht den PEAR-Kodierungskonventionen zu folgen? Hoffen wir, dass die jQuery- und allgemeine CMS-Architektur stabiler ist. – Gordon

0

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

-1

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

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

Änderung es zu:

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

Und es wird wie ein Zauber funktionieren.

+1

Entschuldigung, ich habe versucht, aber es funktioniert nicht –

9

Ich denke, dies kann Ihre Frage beantworten.

Non-static method ..... should not be called statically

Wenn die Methode nicht statisch ist, müssen Sie es wie so initialisieren:

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

Oder in PHP 5.4, können Sie diese Syntax verwenden:

(new ClassName)->method(); 
+0

Ist (new ClassName) -> method(); kompatibel mit PHP 5.3? – Jeff

+1

@ Jeff, würde ich '(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 ausprobiert. – Sonny

0

Wenn Bereichsauflösung :: musste außerhalb der Klasse verwendet werden, dann 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(); 
+1

Können Sie Beispiele für das OP und alle zukünftigen Besucher bereitstellen? –

+0

"; Echo Foo :: staticValue(). "
"; $ foo = neu Foo(); echo $ foo-> Wert();/* Hoffe, dieses Beispiel hilft dir * / –

0

Versuchen Sie folgendes:

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

Es ist für mich in einem ähnlichen Fall gearbeitet.

0

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