오류 메시지 엄격한 표준 : 비 정적 메서드는 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=''){

정적으로 호출하려는 경우.

정적 메서드 (및 Singletons )는 테스트 가능성에 대한 죽음 입니다.

또한 생성자에서 너무 많은 작업을 수행하고 있으며, 특히 쿼리가 거기에 있으면 안됩니다. 생성자가해야 할 일은 객체를 유효한 상태로 설정하는 것입니다. 클래스 외부에서 데이터를 가져와야하는 경우 데이터를 가져 오는 대신 주입하는 것이 좋습니다. 또한 생성자는 아무것도 반환 할 수 없습니다. 그들은 항상 void를 반환하므로 이러한 모든 return false명령문은 구성을 종료합니다.


2
코드는이 책에서 가져온 것입니다 ... packtpub.com/cms-design-using-php-and-jquery/book . 책을 써야한다고 생각 해요, 고든. :-)
shin

5
@shin Nah, 나는 다른 사람들이 전에 나보다 잘 말한 것을 반복 할 것입니다. 그러나 그것은 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 (new ClassName)-> method (); PHP 5.3 과도 호환됩니까?
제프

1
@Jeff, 나는을 사용하고 (new ClassName())->method();, 5-7
Dennis

1
(new ClassName)->method();PHP 5.3과 호환되지 않습니다. 나는 그것을 시도했다.
Sonny

1

이 시도:

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

비슷한 경우에 저에게 효과적이었습니다.



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 ᛦ 2013-08-23

<? php class Foo {/ * 정적 변수 * / public static $ static_var = '정적 변수'; / * Static function * / static function staticValue () {return 'static function'; } / * function * / function Value () {return 'Object'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = 새로운 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.