with - w3school php




رسالة الخطأ المعايير الصارمة: لا يجب استدعاء الأسلوب غير الثابت بشكل ثابت في php (5)

لدي php التالية. ولكن عندما أرى index.php أتلقى رسالة الخطأ التالية.

معايير صارمة: يجب ألا يتم استدعاء الدالة 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 ([email protected]_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 ([email protected]_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
        return $instancesBySpecial[$sp];
    }


إذا كان لا بد من استخدام دقة النطاق :: خارج الفئة ، فيجب إعلان الوظيفة أو المتغير المعني على أنه ثابت

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();

الطرق الخاصة بك تفتقد الكلمة الأساسية static . يتغيرون

function getInstanceByName($name=''){

إلى

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

إذا كنت تريد الاتصال بهم بشكل ثابت.

لاحظ أن الطرق الثابتة (و Singletons ) هي الموت إلى قابلية الاختبار .

لاحظ أيضًا أنك تفعل الكثير من العمل في المُنشئ ، وخاصةً أن كل هذا الاستفسار لا يجب أن يكون موجودًا. من المفترض أن يقوم كل المنشئ بفعله هو تعيين الكائن في حالة صحيحة. إذا كان عليك الحصول على بيانات من خارج الفصل لفعل ذلك ، فضع في اعتبارك حقنها بدلاً من سحبها. لاحظ أيضًا أن المنشئين لا يمكنهم إرجاع أي شيء. سيعودون دائمًا إلى الفراغ ، لذا فإن كل هذه التصريحات return false لا تفعل شيئًا سوى إنهاء البناء.


بدلاً من استخدام المثيل باستخدام عامل دقة النطاق :: لأنه لم يتم تعريفه مثل وظيفة ثابتة.

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

تغييره إلى:

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

وسوف تعمل مثل السحر.


عادةً ما يُقصد return false إنهاء إنشاء الكائن بفشل. انها بسيطة على هذا النحو.





static-members