ত্রুটি বার্তা কঠোর মানদণ্ড: অ স্থির পদ্ধতিটি পিএইচপি তে স্থিতিকরভাবে বলা উচিত নয়


114

আমি নিম্নলিখিত পিএইচপি আছে। তবে আমি যখন 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
হুম, এটি এমন কি হতে পারে যে আপনি কোনও পদ্ধতিকে স্ট্যাটিকভাবে কল করছেন, এবং সেই পদ্ধতিটি স্থির হিসাবে সংজ্ঞায়িত হয়নি? আপনি জানেন, ত্রুটিটি ঠিক কী বলেছে, লাইন নম্বরে এটি যা বলেছে ...
Harold1983-

উত্তর:


189

আপনার পদ্ধতিগুলি staticকীওয়ার্ডটি অনুপস্থিত । পরিবর্তন

function getInstanceByName($name=''){

প্রতি

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

আপনি যদি তাদের স্থিতি কল করতে চান।

দ্রষ্টব্য যে স্থির পদ্ধতি (এবং সিঙ্গলটনের ) পরীক্ষার জন্য মৃত্যু

এছাড়াও মনে রাখবেন যে আপনি কনস্ট্রাক্টরে খুব বেশি কাজ করছেন, বিশেষত যে অনুসন্ধানগুলি সেখানে থাকা উচিত নয়। আপনার সমস্ত কন্সট্রাক্টরের কাজটি অবৈধ স্থিতিতে সেট করা। আপনার কাছে যদি ক্লাসের বাইরে থেকে কোনও ডেটা থাকতে হয় যা এটিকে টানানোর পরিবর্তে ইঞ্জেকশন করার বিষয়টি বিবেচনা করে। এছাড়াও নোট করুন যে কনস্ট্রাক্টররা কিছুই ফিরিয়ে দিতে পারে না। তারা সর্বদা অকার্যকর ফিরে আসবে তাই এই সমস্ত return falseবিবৃতি নির্মাণ শেষ করা ছাড়া কিছুই করে না।


2
কোডগুলি এই বইটি থেকে ... প্যাকটপব . com/cms-design-used-php-and-jquery/book । আমার মনে হয় তোমার একটা বই লেখা উচিত গর্ডন। :-)
শনি

5
@ শিন নাহ, আমি কেবল তার চেয়ে আগে অন্যরা যা বলেছি তার পুনরাবৃত্তি করব। তবে ডিসেম্বর ২০১০ প্রকাশিত একটি বইয়ের এটি বেশ কিছু খারাপ কোড। তারা কি কোনও দৃশ্যমান কীওয়ার্ড বাদ দেওয়ার বা পিয়ার কোডিং কনভেনশন অনুসরণ না করার কোনও কারণ দেয়? আসুন আশা করি jQuery এবং সাধারণ সিএমএস আর্কিটেকচারটি আরও দৃ is়।
গর্ডন

17
@ ডিজোনা যা কোডটি দিয়ে সমস্যাগুলি উপেক্ষা করবে, এটি সংশোধন করে না।
গর্ডন

1
গুরুত্বপূর্ণ দ্রষ্টব্য: publicমূলশব্দটি কোনও শ্রেণীর মধ্যে থেকে কেবল ফাংশন / পরিবর্তনশীল ঘোষণায় ব্যবহৃত হয়। দেখুন stackoverflow.com/questions/13341378/...
cssyphus

1
@ গর্ডন, কেবল কৌতূহল - আপনি staticকোডটি ব্যবহার করার জন্য (পুনরায়) পরিবর্তে আপত্তিজনক পদ্ধতিতে পরিবর্তনের পক্ষে কেন $p = new Page(); $p->getInstanceByName();?
ডেনিস

21

আমি মনে করি এটি আপনার প্রশ্নের উত্তর দিতে পারে।

স্থিতিশীল পদ্ধতি ..... স্ট্যাটিকালি বলা উচিত নয়

যদি পদ্ধতিটি স্থিতিশীল না হয় তবে আপনার এটির মতো এটি শুরু করতে হবে:

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

অথবা, পিএইচপি 5.4+ এ আপনি এই সিনট্যাক্সটি ব্যবহার করতে পারেন:

(new ClassName)->method();

হয় (নতুন ClassName) -> পদ্ধতি (); পিএইচপি 5.3 সঙ্গে সামঞ্জস্যপূর্ণ?
জেফ

1
@ জেফ, আমি ব্যবহার (new ClassName())->method();করব এবং আমি বিশ্বাস করি যে এটি পিএইচপি সাথে 5 থেকে 7 পর্যন্ত সামঞ্জস্যপূর্ণ
ডেনিস

1
(new ClassName)->method();পিএইচপি 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
আপনি ওপি এবং ভবিষ্যতের সমস্ত দর্শনার্থীর জন্য উদাহরণ সরবরাহ করতে পারেন?
বি 001

<? পিএইচপি ক্লাস ফু {/ * স্ট্যাটিক ভেরিয়েবল * / পাবলিক স্ট্যাটিক $ স্ট্যাটিক_ভার = 'স্ট্যাটিক ভেরিয়েবল'; / * স্ট্যাটিক ফাংশন * / স্ট্যাটিক ফাংশন স্ট্যাটিকভ্যালু () {রিটার্ন 'স্ট্যাটিক ফাংশন'; } / * ফাংশন * / ফাংশন মান () {'অবজেক্ট' ফেরত; }} প্রতিধ্বনি ফু :: $ স্ট্যাটিক_ভার। "<br/>"; প্রতিধ্বনি ফু: স্ট্যাটিকভ্যালু ()। "<br/>"; oo foo = নতুন ফু (); প্রতিধ্বনি $ foo-> মান (); / * আশা করি এই উদাহরণটি আপনাকে সহায়তা করে * /
রবি কৃষ্ণন

-1

স্কোপ রেজোলিউশন অপারেটরের সাথে উদাহরণটি ব্যবহার করার পরিবর্তে :: কারণ এটি স্থির ফাংশনের মতো সংজ্ঞায়িত হয়নি।

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

এটিকে পরিবর্তন করুন:

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

এবং এটি একটি কবজ মত কাজ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.