【问题标题】:Error message Strict standards: Non-static method should not be called statically in php错误信息 严格标准:非静态方法不应在 php 中静态调用
【发布时间】:2011-06-08 17:45:23
【问题描述】:

我有以下 php.ini 文件。但是,当我看到 index.php 时,我收到以下错误消息。

严格标准:非静态方法 Page::getInstanceByName() 不应该 被静态调用 /var/www/webworks/index.php 第 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;
}
...
...

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

页面.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


【解决方案1】:

您的方法缺少static keyword。改变

function getInstanceByName($name=''){

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

如果你想静态调用它们。

请注意,静态方法(和Singletons)是death to testability

还请注意,您在构造函数中做了太多工作,尤其是所有查询都不应该在那里。您的构造函数应该做的就是将对象设置为有效状态。如果您必须从类外部获取数据才能做到这一点,请考虑注入它而不是拉取它。另请注意,构造函数不能返回任何内容。它们将始终返回 void,因此所有这些 return false 语句只会结束构造。

【讨论】:

  • 代码来自本书...packtpub.com/cms-design-using-php-and-jquery/book。我认为你应该写一本书,戈登。 :-)
  • @shin Nah,我只会重复别人之前说的比我好。但对于 2010 年 12 月出版的一本书来说,这是一些非常糟糕的代码。它们是否给出了省略任何可见性关键字或不遵循 PEAR 编码约定的任何理由?让我们希望 jQuery 和通用 CMS 架构更加稳固。
  • @dzona 会忽略代码问题,而不是修复它。
  • 重要提示:public 关键字仅用于类中的函数/变量声明。见stackoverflow.com/questions/13341378/…
  • @Gordon,只是好奇——为什么你主张将违规方法更改为static,而不是(重新)编写代码以使用$p = new Page(); $p-&gt;getInstanceByName();
【解决方案2】:

我想这可能会回答你的问题。

Non-static method ..... should not be called statically

如果方法不是静态的,你需要像这样初始化它:

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

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

(new ClassName)->method();

【讨论】:

  • Is (new ClassName)->method();也兼容 PHP 5.3?
  • @Jeff,我会使用(new ClassName())-&gt;method();,我相信它与 PHP 5 到 7 兼容
  • (new ClassName)-&gt;method(); 与 PHP 5.3 不兼容。我刚试过。
【解决方案3】:

如果必须在类外使用范围解析 :: 则相应的函数或变量应声明为静态

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

【讨论】:

  • 您能为 OP 和所有未来的访问者提供示例吗?
  • ";回声 Foo::staticValue()。 "
    "; $foo = 新的 Foo();回声 $foo->Value(); /*希望这个例子对你有帮助*/
【解决方案4】:

试试这个:

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

它在类似的情况下对我有用。

【讨论】:

    【解决方案5】:

    使用 类名->函数(); 反而 类名::函数();

    【讨论】:

      【解决方案6】:

      return false 通常意味着以失败终止对象创建。就这么简单。

      【讨论】:

        【解决方案7】:

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

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

        改成:

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

        它会像魅力一样发挥作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          • 2013-03-31
          相关资源
          最近更新 更多