त्रुटि संदेश सख्त मानक: गैर स्थैतिक विधि को php में वैधानिक रूप से नहीं कहा जाना चाहिए


114

मेरे पास निम्नलिखित php है। हालाँकि जब मैं index.php देखता हूं तो मुझे निम्न त्रुटि संदेश मिलता है।

सख्त मानक: गैर-स्थैतिक विधि पृष्ठ :: getInstanceByName () को लाइन 12 पर /var/www/webworks/index.php में वैधानिक रूप से नहीं कहा जाना चाहिए।

मुझे उम्मीद है कि कोई मुझे बता सकता है कि समस्या को कैसे ठीक किया जाए।

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
हम्म, क्या ऐसा हो सकता है कि आप एक विधि को सांख्यिकीय रूप से कह रहे हों, और उस पद्धति को स्थिर के रूप में परिभाषित नहीं किया गया है? तुम्हें पता है, काफी हद तक त्रुटि क्या कहता है, लाइन नंबर पर यह कहता है ...
हेरोल्ड

जवाबों:


189

आपके तरीके staticकीवर्ड को याद कर रहे हैं । परिवर्तन

function getInstanceByName($name=''){

सेवा

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

यदि आप उन्हें सांख्यिकीय रूप से कॉल करना चाहते हैं।

ध्यान दें कि स्थिर विधियाँ (और सिंगलटन ) परीक्षणशीलता के लिए मृत्यु हैं ।

यह भी ध्यान दें कि आप कंस्ट्रक्टर में बहुत अधिक काम कर रहे हैं, विशेष रूप से सभी कि क्वेरी वहाँ नहीं होनी चाहिए। आपके सभी कंस्ट्रक्टर को ऑब्जेक्ट को एक वैध स्थिति में सेट करना है। यदि आपके पास ऐसा करने के लिए कक्षा के बाहर से डेटा होना चाहिए, तो इसे खींचने के बजाय इसे इंजेक्ट करने पर विचार करें। यह भी ध्यान दें कि कंस्ट्रक्टर कुछ भी वापस नहीं कर सकते हैं। वे हमेशा शून्य लौट आएंगे, इसलिए ये सभी return falseबयान कुछ भी नहीं करते हैं लेकिन निर्माण को समाप्त करते हैं।


2
कोड इस पुस्तक के हैं ... packtpub.com/cms-design-using-php-and-jquery/book । मुझे लगता है कि आपको एक किताब गॉर्डन लिखनी चाहिए। :-)
पिंडली

5
@ शिन नाह, मैं केवल वही दोहराऊंगा जो दूसरों ने मुझसे पहले कहा है। लेकिन यह है कि दिसंबर 2010 को जारी की गई पुस्तक के लिए कुछ बहुत बुरा कोड है। क्या वे किसी भी दृश्यता कीवर्ड को छोड़ने या PEAR कोडिंग सम्मेलन का पालन नहीं करने का कोई कारण देते हैं? चलो उम्मीद करते हैं कि jQuery और सामान्य सीएमएस वास्तुकला अधिक ठोस है।
गॉर्डन

17
@d Arizona जो कोड के साथ समस्याओं को अनदेखा कर रहा होगा, उसे ठीक नहीं करना।
गॉर्डन

1
महत्वपूर्ण नोट: publicकीवर्ड का उपयोग केवल कक्षा के भीतर फ़ंक्शन / चर घोषणाओं में किया जाता है। देखें stackoverflow.com/questions/13341378/...
cssyphus

1
@ गोर्डन, बस जिज्ञासु - आप static(री) का उपयोग करने के लिए कोड लिखने के बजाय, अपमानजनक पद्धति को बदलने की वकालत क्यों करते हैं $p = new Page(); $p->getInstanceByName();?
डेनिस

21

मुझे लगता है कि यह आपके सवाल का जवाब दे सकता है।

गैर-स्थैतिक विधि ..... को सांख्यिकीय रूप से नहीं कहा जाना चाहिए

यदि विधि स्थिर नहीं है, तो आपको इसे शुरू करने की आवश्यकता है:

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

या, PHP 5.4+ में, आप इस सिंटैक्स का उपयोग कर सकते हैं:

(new ClassName)->method();

है (नया क्लासनेम) -> विधि (); PHP 5.3 के साथ भी संगत है?
जेफ

1
@ जेफ, मैं उपयोग करूंगा, (new ClassName())->method();और मुझे विश्वास है कि यह PHP के साथ 5 से 7 तक संगत है
डेनिस

1
(new ClassName)->method();PHP 5.3 के साथ संगत नहीं है। मैंने बस कोशिश की।
सन्नी



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
क्या आप ओपी और भविष्य के सभी आगंतुकों के लिए उदाहरण प्रदान कर सकते हैं?
11:001 बजे B001 B

<? php class Foo {/ * स्टेटिक चर * / सार्वजनिक स्थैतिक $ static_var = 'स्थिर चर'; / * स्टेटिक फंक्शन * / स्टेटिक फंक्शन staticValue () {रिटर्न 'स्टेटिक फंक्शन'; } / * फ़ंक्शन * / फ़ंक्शन मान () {वापसी 'ऑब्जेक्ट'; }} गूंज फू :: $ static_var। "<br/>"; इको फू :: staticValue ()। "<br/>"; $ फू = नया फू (); इको $ फू-> मूल्य (); / * आशा है कि यह उदाहरण आपकी मदद करता है * /
रवि कृष्णन

-1

गुंजाइश रिज़ॉल्यूशन ऑपरेटर के साथ उदाहरण का उपयोग करने के बजाय :: क्योंकि यह स्थिर फ़ंक्शन की तरह परिभाषित नहीं किया गया था।

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

इसे बदलें:

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

और यह एक आकर्षण की तरह काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.