오류 메시지 엄격한 표준: 비정적 메서드는 php에서 정적으로 호출하면 안 됩니다.
다음과 같은 php가 있습니다.그러나 index.php를 보면 다음과 같은 오류 메시지가 나타납니다.
엄격한 표준: 비정적 메서드 페이지::getInstanceByName()은 12행의 /var/www/webworks/index.php에서 정적으로 호출해서는 안 됩니다.
누가 문제 해결 방법을 알려줬으면 좋겠어요.
index.displaces를 표시합니다.
// { 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.common.display
<?php
require dirname(__FILE__).'/basics.php';
...
...
ww.incs/syslogs.displaces
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];
}
메서드에 키워드가 없습니다.바꾸다
function getInstanceByName($name=''){
로.
public static function getInstanceByName($name=''){
스태틱하게 호출하고 싶을 때 사용합니다.
정적 방법(및 싱글톤)은 테스트 가능성에 매우 중요합니다.
또한 컨스트럭터에서 너무 많은 작업을 하고 있으며, 특히 쿼리는 모두 컨스트럭터에 있어서는 안 됩니다.컨스트럭터는 오브젝트를 유효한 상태로 설정하기만 하면 됩니다.이를 위해 클래스 외부에서 데이터를 가져와야 하는 경우 데이터를 끌어오는 대신 주입하는 것을 고려하십시오.또한 컨스트럭터는 아무것도 반환할 수 없습니다.그들은 항상 무효로 돌아올 것이기 때문에 이 모든 것들이return false
스테이트먼트는 건설의 끝만 남습니다.
이게 당신의 질문에 답할 수 있을 것 같아요.
비정적 메서드 .....를 정적으로 호출하면 안 됩니다.
메서드가 스태틱하지 않은 경우 다음과 같이 초기화해야 합니다.
$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()을 사용합니다.대신 className::function();
return false
는 일반적으로 장애가 발생한 오브젝트 작성을 종료하는 것을 의미합니다.그것은 저것만큼 간단하다.
static 함수처럼 정의되지 않았기 때문에 scope resolution 연산자 ::와 함께 인스턴스를 사용하는 대신.
$r=Page::getInstanceByName($page);
다음과 같이 변경합니다.
$r=Page->getInstanceByName($page);
그리고 그것은 마법처럼 작동할 것이다.
언급URL : https://stackoverflow.com/questions/4684454/error-message-strict-standards-non-static-method-should-not-be-called-staticall
'source' 카테고리의 다른 글
Laravel where 관계 객체 (0) | 2022.09.21 |
---|---|
PhpStorm이 탭 닫기를 자동으로 중지하도록 설정 (0) | 2022.09.21 |
메이븐 설치 OSX오류 지원되지 않는major.minor 버전 51.0. (0) | 2022.09.21 |
외부 키 제약 조건이 잘못 형성되어 테이블 생성이 실패함 (0) | 2022.09.21 |
ERROR 1045 (28000):사용자 'root'@'localhost'에 대한 액세스가 거부되었습니다(암호: YES 사용). (0) | 2022.09.21 |