Mam następujący plik php. Jednak gdy widzę plik index.php, pojawia się następujący komunikat o błędzie.
Ścisłe standardy: Metoda niestatyczna Page :: getInstanceByName () nie powinna być wywoływana statycznie w /var/www/webworks/index.php w linii 12
Mam nadzieję, że ktoś może mi powiedzieć, jak rozwiązać problem.
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];
}
php
static-members
piszczel
źródło
źródło
Odpowiedzi:
W Twoich metodach brakuje
static
słowa kluczowego . Zmianado
jeśli chcesz zadzwonić do nich statycznie.
Zauważ, że metody statyczne (i Singletony ) są śmiertelne dla testowalności .
Zauważ również, że wykonujesz zbyt dużo pracy w konstruktorze, zwłaszcza że nie powinno tam być całego zapytania. Wszystko, co powinien zrobić twój konstruktor, to ustawić obiekt w prawidłowym stanie. Jeśli musisz mieć dane spoza klasy, aby to zrobić, rozważ wstrzyknięcie ich zamiast pobierania. Pamiętaj również, że konstruktorzy nie mogą niczego zwrócić. Będą zawsze zwracane jako nieważne, więc wszystkie te
return false
stwierdzenia tylko kończą konstrukcję.źródło
public
słowo kluczowe jest używane tylko w deklaracjach funkcji / zmiennych z klasy. Zobacz stackoverflow.com/questions/13341378/…static
zamiast (ponownego) pisania kodu do użycia$p = new Page(); $p->getInstanceByName();
?Myślę, że to może odpowiedzieć na twoje pytanie.
Metoda niestatyczna ..... nie powinna być wywoływana statycznie
Jeśli metoda nie jest statyczna, musisz ją zainicjować w następujący sposób:
Lub w PHP 5.4+ możesz użyć następującej składni:
źródło
(new ClassName())->method();
i uważam, że jest kompatybilny z PHP od 5 do 7(new ClassName)->method();
nie jest kompatybilny z PHP 5.3. Właśnie tego spróbowałem.Spróbuj tego:
U mnie zadziałało w podobnym przypadku.
źródło
użyj className-> function (); zamiast className :: function ();
źródło
return false
ma zwykle na celu przerwanie tworzenia obiektu niepowodzeniem. To takie proste.źródło
Jeśli rozdzielczość zakresu :: musiała zostać użyta poza klasą, wówczas odpowiednia funkcja lub zmienna powinna być zadeklarowana jako statyczna
źródło
Zamiast używać instancji z operatorem rozpoznawania zakresu :: ponieważ nie została zdefiniowana jako funkcja statyczna.
zmień to na:
I będzie działać jak urok.
źródło