J'ai le php suivant. Cependant, lorsque je vois le fichier index.php, le message d'erreur suivant s'affiche.
Normes strictes: la méthode non statique Page :: getInstanceByName () ne doit pas être appelée de manière statique dans /var/www/webworks/index.php à la ligne 12
J'espère que quelqu'un pourra me dire comment résoudre le problème.
Merci d'avance.
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];
}
Il manque à votre méthode static
mot-clé . Changement
function getInstanceByName($name=''){
à
public static function getInstanceByName($name=''){
si vous voulez les appeler statiquement.
Notez que les méthodes statiques (et Singletons ) sont mort à testabilité .
Notez également que vous travaillez beaucoup trop dans le constructeur, en particulier toutes les requêtes ne devraient pas y figurer. Tout ce que votre constructeur est censé faire est de définir l'objet dans un état valide. Si vous devez disposer de données extérieures à la classe, envisagez de les injecter au lieu de les extraire. Notez également que les constructeurs ne peuvent rien retourner. Ils retourneront toujours nuls afin que toutes ces déclarations return false
ne finissent que la fin de la construction.
Je pense que cela peut répondre à votre question.
La méthode non statique ..... ne devrait pas être appelée de manière statique
Si la méthode n'est pas statique, vous devez l'initialiser de la manière suivante:
$var = new ClassName();
$var->method();
Ou, dans PHP 5.4, vous pouvez utiliser cette syntaxe:
(new ClassName)->method();
Essaye ça:
$r = Page()->getInstanceByName($page);
Cela a fonctionné pour moi dans un cas similaire.
utilisez className-> function (); à la place className :: function ();
return false
est généralement destiné à mettre fin à la création de l'objet avec un échec. C'est aussi simple que ça.
Si scope resolution :: doit être utilisé en dehors de la classe, la fonction ou la variable correspondante doit être déclarée comme statique
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();