错误消息严格的标准: 非静态方法不应该在 php 中静态调用

我有下面的 php,但是当我看到 index.php 时,我得到了下面的错误消息。

严格的标准: 非静态方法 Page::getInstanceByName() should not 被静态地调用 /var/www/webworks/index.php on line 12

我希望有人能告诉我如何解决这个问题。

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;
}
...
...

Www.incs/common.php

<?php
require dirname(__FILE__).'/basics.php';
...
...

Www.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];
}
326024 次浏览

您的方法缺少 static关键字。更改

function getInstanceByName($name=''){

public static function getInstanceByName($name=''){

如果你想静态地调用它们。

请注意,静态方法(和 Singletons)是 可验证性之死

还要注意,您在构造函数中做了太多的工作,特别是所有的查询都不应该在构造函数中。构造函数所要做的就是将对象设置为有效状态。如果必须从类外部获取数据才能执行此操作,可以考虑注入数据而不是拉取数据。还要注意,构造函数不能返回任何内容。它们总是返回 void,所以所有这些 return false语句只会结束构造。

return false is usually meant to terminate the object creation with a failure. It is as simple as that.

而不是使用范围解析运算符: : 的实例,因为它不像静态函数那样定义。

$r=Page::getInstanceByName($page);

改成:

$r=Page->getInstanceByName($page);

而且效果非常好。

我想这也许能回答你的问题。

非静态方法... . . 不应该被静态调用

If the method is not static you need to initialize it like so:

$var = new ClassName();
$var->method();

或者,在 PHP 5.4 + 中,您可以使用以下语法:

(new ClassName)->method();

如果范围解析: : 必须在类之外使用,那么相应的函数或变量应该声明为 static

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();

试试这个:

$r = Page()->getInstanceByName($page);

在一个类似的案子里,我也是这么做的。

ClassName-> function () ; 取而代之 函数() ;