エラーメッセージ厳密な標準:非静的メソッドはPHPで静的に呼び出すべきではありません


114

次の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];
    }

15
うーん、それはあなたが静的にメソッドを呼び出していて、そのメソッドが静的として定義されていない可能性がありますか?あなたはそれが言う行番号に、エラーが語る、かなり正確に何を、知っている...
Harold1983-

回答:


189

メソッドにstaticキーワードがありません。変化する

function getInstanceByName($name=''){

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

静的に呼び出したい場合。

静的メソッド(およびシングルトン)は、テスト容易性にとって致命的であることに注意してください。

また、コンストラクターで実行している作業が多すぎることにも注意してください。特に、クエリはそこにあるべきではありません。コンストラクターが行うべきことは、オブジェクトを有効な状態に設定することだけです。クラスの外部からデータを取得する必要がある場合は、プルするのではなく、注入することを検討してください。また、コンストラクタは何も返すことができないことに注意してください。これらは常にvoidを返すため、これらのすべてのreturn falseステートメントは構築を終了するだけです。


2
コードはこの本からのものです... packtpub.com/cms-design-using-php-and-jquery/book。ゴードン、あなたは本を書くべきだと思います。:-)

5
@shinいや、私は他の人が私よりも前に言ったことを繰り返すだけです。しかし、それは2010年12月にリリースされた本のいくつかの本当に悪いコードです。それらは、可視性キーワードを省略したり、PEARコーディング規則に従わない理由を与えますか?jQueryと一般的なCMSアーキテクチャーがより堅固であることを望みます。
Gordon

17
@dzonaはコードの問題を無視し、修正はしません。
Gordon

1
重要な注意:publicキーワードは、クラス内からの関数/変数宣言でのみ使用されます。stackoverflow.com/questions/13341378/…を
cssyphus

1
@Gordon、好奇心旺盛です- static使用するコードを(再)作成するのではなく、問題のメソッドをに変更することを推奨するのはなぜ$p = new Page(); $p->getInstanceByName();ですか?
Dennis

21

これはあなたの質問に答えるかもしれません。

非静的メソッド.....静的に呼び出すべきではありません

メソッドが静的でない場合は、次のように初期化する必要があります。

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

または、PHP 5.4以降では、次の構文を使用できます。

(new ClassName)->method();

Is(新しいClassName)-> method(); PHP 5.3とも互換性がありますか?
ジェフ

1
@Jeff、私はを使用します。5〜7の(new ClassName())->method();PHPと互換性があると思います
Dennis

1
(new ClassName)->method();PHP 5.3と互換性がありません。試してみたところです。
Sonny



0

return false通常、オブジェクトの作成を失敗して終了することを意図しています。それはそれと同じくらい簡単です。


0

スコープ解決::をクラスの外部で使用する必要がある場合、それぞれの関数または変数を静的として宣言する必要があります

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

1
OPとすべての将来の訪問者の例を提供できますか?
B001ᛦ2016

<?php class Foo {/ *静的変数* / public static $ static_var = '静的変数'; / *静的関数* / 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(); / *この例がお役に立てば幸いです* /
Ravi Krishnan

-1

スコープ解決演算子とともにインスタンスを使用する代わりに::静的関数のように定義されていなかったため。

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

それを次のように変更します。

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

そしてそれは魅力のように働きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.