J'ai le php suivant. Cependant, lorsque je vois l'index.php, j'obtiens le message d'erreur suivant.
Normes strictes: La méthode non statique Page :: getInstanceByName () ne doit pas être appelée statiquement dans /var/www/webworks/index.php à la ligne 12
J'espère que quelqu'un pourra me dire comment résoudre le problème.
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
tibia
la source
la source
Réponses:
Vos méthodes manquent le
static
mot - clé . Changementà
si vous souhaitez les appeler de manière statique.
Notez que les méthodes statiques (et les singletons ) sont mortelles pour la testabilité .
Notez également que vous faites beaucoup trop de travail dans le constructeur, en particulier tout ce que les requêtes ne devraient pas être là. Tout ce que votre constructeur est censé faire est de mettre l'objet dans un état valide. Si vous devez avoir des données extérieures à la classe pour le faire, pensez à les injecter au lieu de les extraire. Notez également que les constructeurs ne peuvent rien renvoyer. Ils retourneront toujours nul, donc toutes ces
return false
déclarations ne font rien d'autre que mettre fin à la construction.la source
public
mot-clé est utilisé uniquement dans les déclarations de fonction / variable à partir d'une classe. Voir stackoverflow.com/questions/13341378/…static
lieu de (ré) écrire le code à utiliser$p = new Page(); $p->getInstanceByName();
?Je pense que cela peut répondre à votre question.
La méthode non statique ..... ne doit pas être appelée statiquement
Si la méthode n'est pas statique, vous devez l'initialiser comme ceci:
Ou, dans PHP 5.4+, vous pouvez utiliser cette syntaxe:
la source
(new ClassName())->method();
, et je crois qu'il est compatible avec PHP de 5 à 7(new ClassName)->method();
n'est pas compatible avec PHP 5.3. J'ai juste essayé.Essaye ça:
Cela a fonctionné pour moi dans un cas similaire.
la source
utilisez className-> function (); à la place className :: function ();
la source
return false
est généralement destiné à terminer la création de l'objet avec un échec. C'est aussi simple que ça.la source
Si la résolution de portée :: devait être utilisée en dehors de la classe, la fonction ou la variable respective devrait être déclarée comme statique
la source
Au lieu d'utiliser l'instance avec l'opérateur de résolution de portée :: car elle n'a pas été définie comme une fonction statique.
changez-le en:
Et cela fonctionnera comme un charme.
la source