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];
}
php
static-members
Schienbein
quelle
quelle
Antworten:
Ihren Methoden fehlt das
static
Schlüsselwort . Veränderungzu
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 false
Aussagen nichts anderes tun, als die Konstruktion zu beenden.quelle
public
Schlüsselwort wird nur in Funktions- / Variablendeklarationen innerhalb einer Klasse verwendet. Siehe stackoverflow.com/questions/13341378/…static
, anstatt den zu verwendenden Code (neu) zu schreiben$p = new Page(); $p->getInstanceByName();
?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:
In PHP 5.4+ können Sie diese Syntax verwenden:
quelle
(new ClassName())->method();
, und ich glaube, es ist kompatibel mit PHP von 5 bis 7(new ClassName)->method();
ist nicht kompatibel mit PHP 5.3. Ich habe es gerade versucht.Versuche dies:
In einem ähnlichen Fall hat es bei mir funktioniert.
quelle
benutze className-> function (); stattdessen className :: function ();
quelle
return false
ist normalerweise dazu gedacht, die Objekterstellung mit einem Fehler zu beenden. So einfach ist das.quelle
Wenn die Bereichsauflösung :: außerhalb der Klasse verwendet werden musste, sollte die entsprechende Funktion oder Variable als statisch deklariert werden
quelle
Anstatt die Instanz mit dem Bereichsauflösungsoperator :: zu verwenden, weil sie nicht als statische Funktion definiert wurde.
ändere es in:
Und es wird wie ein Zauber wirken.
quelle