我有以下php。但是,当我看到index.php时,出现以下错误消息。
严格的标准:非静态方法Page :: getInstanceByName()不应在第12行的/var/www/webworks/index.php中被静态调用
我希望有人可以告诉我如何解决该问题。
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]; }
您的方法缺少static关键字。更改
static
function getInstanceByName($name=''){
至
public static function getInstanceByName($name=''){
如果要静态调用它们。
请注意,静态方法和Singletons是可测试性的牺牲品。
还要注意,您在构造函数中做的工作太多了,尤其是所有查询都不应放在其中。您的构造函数应该做的就是将对象设置为有效状态。如果您必须从类外部获取数据,请考虑注入数据而不是提取数据。另请注意,构造函数无法返回任何内容。它们将始终返回void,因此所有这些returnfalse语句都只会终止构造。
returnfalse