У меня есть следующий файл php. Однако, когда я вижу 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';
}
}
...
...
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];
}
php
static-members
голень
источник
источник
Ответы:
В ваших методах отсутствует
static
ключевое слово . + Изменитьв
если вы хотите вызвать их статически.
Обратите внимание, что статические методы (и синглтоны ) смертельны для тестируемости .
Также обратите внимание, что вы слишком много работаете в конструкторе, особенно все, что запросы не должны быть там. Все, что должен сделать ваш конструктор, - это установить объект в допустимое состояние. Если для этого вам нужны данные извне класса, подумайте о том, чтобы ввести их, а не вытащить. Также обратите внимание, что конструкторы ничего не могут вернуть. Они всегда будут возвращать void, поэтому все эти
return false
операторы ничего не делают, кроме как завершают построение.источник
public
ключевое слово используется только в объявлениях функций / переменных внутри класса. См stackoverflow.com/questions/13341378/...static
вместо (пере) написания кода для использования$p = new Page(); $p->getInstanceByName();
?Думаю, это может ответить на ваш вопрос.
Нестатический метод ..... не должен вызываться статически
Если метод не статический, вам нужно инициализировать его так:
Или, в PHP 5.4+, вы можете использовать этот синтаксис:
источник
(new ClassName())->method();
, и я считаю, что он совместим с PHP с 5 по 7(new ClassName)->method();
не совместим с PHP 5.3. Я только что попробовал.Попробуй это:
У меня это сработало в аналогичном случае.
источник
используйте className-> function (); вместо className :: function ();
источник
return false
обычно означает прекращение создания объекта с ошибкой. Это так просто.источник
Если разрешение области видимости :: должно использоваться вне класса, тогда соответствующая функция или переменная должна быть объявлена как статическая.
источник
Вместо использования экземпляра с оператором разрешения области видимости ::, потому что он не был определен как статическая функция.
измените его на:
И это будет работать как шарм.
источник