Pesan kesalahan Standar ketat: Metode non-statis tidak boleh dipanggil secara statis di php

114

Saya memiliki php berikut. Namun ketika saya melihat index.php saya mendapatkan pesan kesalahan berikut.

Standar ketat: Metode non-statis Page :: getInstanceByName () tidak boleh dipanggil secara statis di /var/www/webworks/index.php pada baris 12

Saya berharap seseorang dapat memberi tahu saya cara memperbaiki masalah.

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];
    }
tulang kering
sumber
15
Hmm, mungkinkah Anda memanggil metode secara statis, dan metode itu tidak didefinisikan sebagai statis? Anda tahu, persis seperti kesalahannya, di nomor baris tertulis ...
Harold1983-

Jawaban:

189

Metode Anda kehilangan statickata kunci . Perubahan

function getInstanceByName($name=''){

untuk

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

jika Anda ingin memanggilnya secara statis.

Perhatikan bahwa metode statis (dan Singletons ) adalah kematian bagi kemampuan pengujian .

Perhatikan juga bahwa Anda melakukan terlalu banyak pekerjaan di konstruktor, terutama semua kueri yang seharusnya tidak ada di sana. Yang harus dilakukan oleh konstruktor Anda adalah menyetel objek ke status yang valid. Jika Anda harus memiliki data dari luar kelas untuk melakukan itu, pertimbangkan untuk memasukkannya daripada menariknya. Perhatikan juga bahwa konstruktor tidak dapat mengembalikan apa pun. Mereka akan selalu mengembalikan kekosongan sehingga semua return falsepernyataan ini tidak melakukan apa-apa selain mengakhiri konstruksi.

Gordon
sumber
2
Kode berasal dari buku ini ... packtpub.com/cms-design-using-php-and-jquery/book . Saya pikir Anda harus menulis buku, Gordon. :-)
shin
5
@ shin Nah, saya hanya akan mengulangi apa yang orang lain katakan lebih baik dari saya sebelumnya. Tapi itu adalah kode yang sangat buruk untuk sebuah buku yang dirilis pada Desember 2010. Apakah mereka memberikan alasan untuk menghilangkan kata kunci visibilitas atau tidak mengikuti konvensi pengkodean PEAR? Semoga arsitektur jQuery dan CMS umum lebih solid.
Gordon
17
@dzona yang akan mengabaikan masalah pada kode, bukan memperbaikinya.
Gordon
1
CATATAN Penting: publickata kunci hanya digunakan dalam deklarasi fungsi / variabel dari dalam kelas. Lihat stackoverflow.com/questions/13341378/…
cssyphus
1
@ Gordon, hanya ingin tahu - mengapa Anda menganjurkan mengubah metode yang menyinggung static, daripada menulis (ulang) kode untuk digunakan $p = new Page(); $p->getInstanceByName();?
Dennis
21

Saya pikir ini mungkin menjawab pertanyaan Anda.

Metode non-statis ..... tidak boleh dipanggil secara statis

Jika metode ini tidak statis Anda perlu menginisialisasi seperti ini:

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

Atau, di PHP 5.4+, Anda dapat menggunakan sintaks ini:

(new ClassName)->method();
Kacang
sumber
Is (new ClassName) -> method (); kompatibel dengan PHP 5.3 juga?
Jeff
1
@Jeff, saya akan menggunakan (new ClassName())->method();, dan saya yakin ini kompatibel dengan PHP dari 5 hingga 7
Dennis
1
(new ClassName)->method();tidak kompatibel dengan PHP 5.3. Saya baru mencobanya.
Sonny
1

Coba ini:

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

Itu berhasil untuk saya dalam kasus serupa.

Andrés Frías
sumber
1

gunakan className-> function (); sebagai gantinya className :: function ();

ulas korpe
sumber
0

return falsebiasanya dimaksudkan untuk menghentikan pembuatan objek dengan kegagalan. Sesederhana itu.

Tomas
sumber
0

Jika scope resolution :: harus digunakan di luar kelas maka masing-masing fungsi atau variabel harus dideklarasikan sebagai statis

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();
Ravi Krishnan
sumber
1
Bisakah Anda memberikan contoh untuk OP dan semua pengunjung di masa mendatang?
B001 ᛦ
<? php class Foo {/ * Variabel statis * / public static $ static_var = 'variabel statis'; / * Fungsi statis * / fungsi statis staticValue () {return 'static function'; } / * function * / function Value () {return 'Object'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = new Foo (); echo $ foo-> Nilai (); / * Semoga contoh ini bisa membantu Anda * /
Ravi Krishnan
-1

Alih-alih menggunakan instance dengan operator resolusi lingkup :: karena tidak didefinisikan seperti fungsi statis.

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

ubah menjadi:

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

Dan itu akan bekerja seperti pesona.

Lorand
sumber