ข้อความแสดงข้อผิดพลาดมาตรฐานที่เข้มงวด: ไม่ควรเรียกเมธอดแบบคงที่ใน php


114

ฉันมี php ต่อไปนี้ อย่างไรก็ตามเมื่อฉันเห็น index.php ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้

มาตรฐานที่เข้มงวด: วิธีการแบบไม่คงที่ Page :: 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 (!@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=''){

ถ้าคุณต้องการเรียกมันแบบคงที่

โปรดทราบว่าวิธีการแบบคง (และSingletons ) เป็นความตายมาสู่การตรวจสอบได้

โปรดทราบว่าคุณกำลังทำงานมากเกินไปในตัวสร้างโดยเฉพาะอย่างยิ่งการสืบค้นทั้งหมดที่ไม่ควรอยู่ในนั้น ตัวสร้างทั้งหมดของคุณควรทำคือตั้งค่าวัตถุให้อยู่ในสถานะที่ถูกต้อง หากคุณต้องมีข้อมูลจากภายนอกชั้นเรียนให้พิจารณาการอัดฉีดแทนการดึงข้อมูล โปรดทราบว่าผู้ก่อสร้างไม่สามารถส่งคืนอะไรได้ พวกเขาจะกลับมาเป็นโมฆะเสมอดังนั้นข้อความทั้งหมดนี้จึงreturn falseไม่ได้ทำอะไรนอกจากยุติการก่อสร้าง


2
รหัสจากหนังสือเล่มนี้ ... packtpub.com/cms-design-using-php-and-jquery/book ฉันคิดว่าคุณควรเขียนหนังสือกอร์ดอน :-)
หน้าแข้ง

5
@ ชินนะฉันจะพูดซ้ำในสิ่งที่คนอื่นพูดดีกว่าฉันก่อน แต่นั่นเป็นรหัสที่ไม่ดีจริงๆสำหรับหนังสือที่วางจำหน่ายในเดือนธันวาคม 2010 พวกเขาให้เหตุผลใด ๆ ในการละเว้นคำหลักที่สามารถมองเห็นได้หรือไม่ปฏิบัติตามแบบแผนของการเข้ารหัส PEAR หรือไม่ หวังว่าสถาปัตยกรรม jQuery และ CMS ทั่วไปจะแข็งแกร่งมากขึ้น
Gordon

17
@dzona ที่จะเพิกเฉยต่อปัญหาเกี่ยวกับรหัสไม่แก้ไข
กอร์ดอน

1
หมายเหตุสำคัญ: publicคีย์เวิร์ดจะใช้ในการประกาศฟังก์ชัน / ตัวแปรจากภายในคลาสเท่านั้น ดูstackoverflow.com/questions/13341378/…
cssyphus

1
@ Gordon เพียงแค่อยากรู้ - ทำไมคุณถึงสนับสนุนให้เปลี่ยนวิธีการละเมิดเป็นstaticแทนที่จะ (อีกครั้ง) เขียนโค้ดเพื่อใช้$p = new Page(); $p->getInstanceByName();?
Dennis

21

ฉันคิดว่านี่อาจตอบคำถามของคุณได้

วิธีไม่คงที่ ..... ไม่ควรเรียกว่าคงที่

หากวิธีการไม่คงที่คุณต้องเริ่มต้นดังนี้:

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

หรือใน PHP 5.4+ คุณสามารถใช้ไวยากรณ์นี้:

(new ClassName)->method();

คือ (ชื่อคลาสใหม่) -> วิธีการ (); เข้ากันได้กับ PHP 5.3 ด้วย?
Jeff

1
@ เจฟฟ์ฉันใช้ (new ClassName())->method();และฉันเชื่อว่ามันเข้ากันได้กับ PHP ตั้งแต่ 5 ถึง 7
เดนนิส

1
(new ClassName)->method();เข้ากันไม่ได้กับ PHP 5.3 ผมเพิ่งลองทำ
Sonny

1

ลองสิ่งนี้:

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

มันใช้ได้ผลสำหรับฉันในกรณีที่คล้ายกัน



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
คุณสามารถให้ตัวอย่างสำหรับ OP และผู้เยี่ยมชมในอนาคตทั้งหมดได้หรือไม่?
B001 ᛦ

<? php class Foo {/ * Static variable * / public static $ static_var = 'static variable'; / * ฟังก์ชันคงที่ * / ฟังก์ชันคงที่ staticValue () {return 'static function'; } / * function * / function Value () {return 'Object'; }} ก้อง Foo :: $ static_var "<br/>"; เสียงสะท้อน Foo :: staticValue () "<br/>"; $ foo = Foo ใหม่ (); ก้อง $ foo-> ค่า (); / * หวังว่าตัวอย่างนี้จะช่วยคุณได้ * /
Ravi Krishnan

-1

แทนที่จะใช้อินสแตนซ์กับตัวดำเนินการแก้ไขขอบเขต :: เนื่องจากไม่ได้กำหนดไว้เหมือนฟังก์ชันคงที่

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

เปลี่ยนเป็น:

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

และมันจะทำงานเหมือนมีเสน่ห์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.