Hata mesajı Katı standartlar: Statik olmayan yöntem php'de statik olarak çağrılmamalıdır


114

Aşağıdaki php'ye sahibim. Ancak index.php'yi gördüğümde aşağıdaki hata mesajını alıyorum.

Katı standartlar: Statik olmayan yöntem Page :: getInstanceByName (), 12. satırda /var/www/webworks/index.php içinde statik olarak çağrılmamalıdır.

Birinin bana sorunu nasıl çözeceğimi söyleyebileceğini umuyorum.

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
Hmm, bir yöntemi statik olarak çağırıyor olabilirsiniz ve bu yöntem statik olarak tanımlanmamış olabilir mi? Biliyorsunuz, hatanın tam olarak ne söylediği, satır numarasında yazdığı gibi ...
Harold 1983

Yanıtlar:


189

Yöntemlerinizde staticanahtar kelime eksik . Değişiklik

function getInstanceByName($name=''){

için

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

onları durağan olarak aramak istiyorsanız.

Statik yöntemlerin (ve Tekil yöntemlerin ) test edilebilirliğin ölümü olduğunu unutmayın .

Ayrıca, kurucuda çok fazla iş yaptığınızı, özellikle de tüm bu sorgulamanın orada olmaması gerektiğini unutmayın. Yapıcınızın yapması gereken tek şey nesneyi geçerli bir duruma ayarlamaktır. Bunu yapmak için sınıfın dışından veri almanız gerekiyorsa, onu çekmek yerine enjekte etmeyi düşünün. Ayrıca kurucuların hiçbir şey döndüremeyeceğini unutmayın. Her zaman boşa dönecekler, böylece tüm bu return falseifadeler inşaatı bitirmekten başka bir şey yapmaz.


2
Kodlar bu kitaptandır ... packtpub.com/cms-design-using-php-and-jquery/book . Bence bir kitap yazmalısın, Gordon. :-)
shin

5
@shin Nah, sadece başkalarının söylediklerini benden daha iyi tekrarlardım. Ancak bu, Aralık 2010'da yayınlanan bir kitap için gerçekten kötü bir koddur. Görünürlük anahtar kelimelerini atlamak veya PEAR kodlama kuralına uymamak için herhangi bir neden veriyorlar mı? JQuery ve genel CMS mimarisinin daha sağlam olmasını umalım.
Gordon

17
@dzona kodla ilgili sorunları görmezden gelir, düzeltmez.
Gordon

1
Önemli NOT: publicanahtar kelime, yalnızca bir sınıf içindeki işlev / değişken bildirimlerinde kullanılır. Bkz stackoverflow.com/questions/13341378/...
cssyphus

1
@Gordon, merak ediyorum - statickullanmak için kodu (yeniden) yazmak yerine neden rahatsız edici yöntemi değiştirmeyi savunuyorsunuz $p = new Page(); $p->getInstanceByName();?
Dennis

21

Sanırım bu sorunun cevabı olabilir.

Statik olmayan yöntem ..... statik olarak çağrılmamalıdır

Yöntem statik değilse, şu şekilde başlatmanız gerekir:

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

Veya PHP 5.4+ sürümünde bu sözdizimini kullanabilirsiniz:

(new ClassName)->method();

Is (yeni SınıfAdı) -> yöntem (); PHP 5.3 ile de uyumlu mu?
Jeff

1
@Jeff, kullanırdım (new ClassName())->method();ve 5'ten 7'ye kadar PHP ile uyumlu olduğuna inanıyorum
Dennis

1
(new ClassName)->method();PHP 5.3 ile uyumlu değildir. Ben sadece denedim.
Sonny

1

Bunu dene:

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

Benim için benzer bir durumda çalıştı.


1

sınıfAdı-> işlev () kullanın; bunun yerine className :: function ();


0

return falsegenellikle nesne oluşturmayı bir başarısızlıkla sona erdirmek içindir. Bu kadar basit.


0

Kapsam çözünürlüğü :: sınıfın dışında kullanılması gerekiyorsa, ilgili işlev veya değişken statik olarak bildirilmelidir.

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
OP ve gelecekteki tüm ziyaretçiler için örnekler verebilir misiniz?
B001 ᛦ

<? php sınıfı Foo {/ * Statik değişken * / public static $ static_var = 'statik değişken'; / * Statik işlev * / statik işlev staticValue () {'statik işlev' döndür; } / * işlev * / işlev Değer () {return 'Nesne'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = yeni Foo (); echo $ foo-> Değer (); / * Umarım bu örnek size yardımcı olur * /
Ravi Krishnan

-1

Örneği kapsam çözümleme operatörü :: ile kullanmak yerine statik fonksiyon gibi tanımlanmadığı için.

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

şu şekilde değiştirin:

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

Ve bir cazibe gibi çalışacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.