Повідомлення про помилку Суворі стандарти: Нестатичний метод не повинен стати статичним в PHP


114

У мене є такий 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];
    }

15
Хм, чи могло ви бути, що ви називаєте метод статично, і цей метод не визначається як статичний? Ви знаєте, майже саме те, що говорить про помилку, на рядку вказується номер ...
Harold1983-

Відповіді:


189

У ваших методах відсутнє staticключове слово . Зміна

function getInstanceByName($name=''){

до

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

якщо ви хочете зателефонувати їм статично.

Зауважимо, що статичні методи (та синглтонтони ) є смертю для доказування .

Також зауважте, що ви занадто багато працюєте в конструкторі, особливо все, що запитів не повинно бути там. Все, що повинен зробити ваш конструктор, - це встановити об'єкт у дійсному стані. Якщо у вас є дані, що знаходяться поза класом, для цього слід розглянути питання про введення його, а не для витягування. Також зауважте, що конструктори нічого не можуть повернути. Вони завжди повернуться нікчемними, тому всі ці return falseтвердження не зроблять нічого, крім завершення будівництва.


2
Коди з цієї книги ... packtpub.com/cms-design-using-php-and-jquery/book . Я думаю, ти повинен написати книгу, Гордон. :-)
шинь

5
@shin Nah, я б тільки повторив те, що інші говорили краще за мене раніше. Але це дійсно поганий код для книги, яка вийшла в грудні 2010 року. Чи дають вони якісь причини пропускати якісь ключові слова видимості або не слідувати умові кодування PEAR? Будемо сподіватися, що jQuery та загальна архітектура CMS є більш надійними.
Гордон

17
@dzona, яка б ігнорувала проблеми з кодом, а не виправляла його.
Гордон

1
Важливо ПРИМІТКА: publicключове слово використовується лише у деклараціях функцій / змінних з класу. Див stackoverflow.com/questions/13341378 / ...
cssyphus

1
@ Gordon, просто цікаво - чому ви виступаєте за зміну методу образи static, а не для (повторного) написання коду для використання $p = new Page(); $p->getInstanceByName();?
Денніс

21

Я думаю, це може відповісти на ваше запитання.

Нестатичний метод ..... не слід називати статично

Якщо метод не є статичним, його потрібно ініціалізувати так:

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

Або в PHP 5.4+ ви можете використовувати цей синтаксис:

(new ClassName)->method();

Є (новий ClassName) -> метод (); сумісний із PHP 5.3?
Джефф

1
@Jeff, я б використовував (new ClassName())->method();, і я вважаю, що він сумісний з PHP з 5 по 7
Dennis

1
(new ClassName)->method();не сумісний з PHP 5.3. Я просто спробував це.
Сонні


1

використовувати className-> function (); замість className :: function ();


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
Чи можете ви надати приклади для ОП та всіх майбутніх відвідувачів?
B001 ᛦ

<? php клас Foo {/ * Статична змінна * / public static $ static_var = 'статична змінна'; / * Статична функція * / статична функція staticValue () {return 'статична функція'; } / * функція * / функція Value () {return 'Object'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = новий Foo (); echo $ foo-> Value (); / * Сподіваюся, що цей приклад вам допоможе * /
Раві Крішнан

-1

Замість використання екземпляра з оператором вирішення області ::, оскільки він не був визначений як статична функція.

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

змінити його на:

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

І це спрацює як шарм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.