Сообщение об ошибке Строгие стандарты: нестатический метод не следует называть статически в php

У меня есть следующий php. Однако, когда я вижу index.php, я получаю следующее сообщение об ошибке.

Строгие стандарты: нестатический метод. :: 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'; } } ... ... 

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

Solutions Collecting From Web of "Сообщение об ошибке Строгие стандарты: нестатический метод не следует называть статически в php"

В ваших методах отсутствует ключевое слово static . + Изменить

 function getInstanceByName($name=''){ 

в

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

если вы хотите называть их статически.

Обратите внимание, что статические методы (и синглтоны ) являются смертельными для проверки .

Также обратите внимание, что вы выполняете слишком много работы в конструкторе, особенно все, что запросы не должны быть там. Все, что должен сделать ваш конструктор, – установить объект в допустимое состояние. Если вам нужно иметь данные извне класса, чтобы сделать это, подумайте о том, чтобы вводить его, а не тянуть его. Также обратите внимание, что конструкторы ничего не могут вернуть. Они всегда будут возвращать пустоту, поэтому все эти return false утверждений ничего не делают, кроме завершения строительства.

Я думаю, что это может ответить на ваш вопрос.

Нестатический метод ….. не следует называть статическим

Если метод не является статическим, вам необходимо инициализировать его так:

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

Или, в PHP 5.4, вы можете использовать этот синтаксис:

 (new ClassName)->method(); 

return false обычно означает прекратить создание объекта с ошибкой. Это так просто.

Если разрешение области видимости :: должно было использоваться вне класса, то соответствующая функция или переменная должна быть объявлена ​​как статическая

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

Это сработало для меня в аналогичном случае.

use className-> function (); вместо className :: function ();

Вместо использования экземпляра с оператором разрешения области :: поскольку он не был определен как статическая функция.

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

измените его на:

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

И это будет работать как шарм.