Thông báo lỗi Tiêu chuẩn nghiêm ngặt: Phương thức non-static không nên được gọi là static trong php


114

Tôi có php sau đây. Tuy nhiên khi tôi nhìn thấy index.php, tôi nhận được thông báo lỗi sau.

Tiêu chuẩn nghiêm ngặt: Phương thức không tĩnh Trang :: getInstanceByName () không nên được gọi tĩnh trong /var/www/webworks/index.php trên dòng 12

Tôi hy vọng ai đó có thể cho tôi biết cách khắc phục sự cố.

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';
    }
}
...
...

Trang.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, có thể là bạn đang gọi một phương thức tĩnh và phương thức đó không được định nghĩa là tĩnh? Bạn biết đấy, khá chính xác những gì lỗi nói, trên số dòng nó nói ...
Harold1983- 13/01

Câu trả lời:


189

Các phương pháp của bạn thiếu statictừ khóa . Thay đổi

function getInstanceByName($name=''){

đến

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

nếu bạn muốn gọi chúng một cách tĩnh.

Lưu ý rằng các phương thức tĩnh (và Singletons ) là yếu tố có thể kiểm tra được .

Cũng lưu ý rằng bạn đang thực hiện quá nhiều công việc trong hàm tạo, đặc biệt là tất cả các truy vấn không nên ở đó. Tất cả những gì mà hàm tạo của bạn phải làm là đặt đối tượng thành trạng thái hợp lệ. Nếu bạn phải có dữ liệu từ bên ngoài lớp để làm điều đó, hãy xem xét việc tiêm nó thay vì kéo nó. Cũng lưu ý rằng các hàm tạo không thể trả về bất kỳ thứ gì. Chúng sẽ luôn trả về giá trị void nên tất cả các return falsecâu lệnh này không làm gì khác ngoài việc kết thúc quá trình xây dựng.


2
Các mã từ cuốn sách này ... packtpub.com/cms-design-using-php-and-jquery/book . Tôi nghĩ bạn nên viết một cuốn sách, Gordon. :-)
shin

5
@shin Nah, tôi chỉ muốn lặp lại những gì người khác đã nói tốt hơn tôi trước đây. Nhưng đó là một số mã thực sự tồi tệ cho một cuốn sách được phát hành vào tháng 12 năm 2010. Họ có đưa ra bất kỳ lý do nào để bỏ qua bất kỳ từ khóa hiển thị nào hoặc không tuân theo quy ước mã hóa PEAR không? Hãy hy vọng kiến ​​trúc jQuery và CMS chung sẽ vững chắc hơn.
Gordon

17
@dzona sẽ bỏ qua các vấn đề với mã, không sửa nó.
Gordon

1
LƯU Ý quan trọng: publictừ khóa chỉ được sử dụng trong khai báo hàm / biến từ bên trong một lớp. Xem stackoverflow.com/questions/13341378/…
cssyphus

1
@Gordon, chỉ là tò mò - tại sao bạn lại ủng hộ việc thay đổi phương thức vi phạm thành static, thay vì (lại) viết mã để sử dụng $p = new Page(); $p->getInstanceByName();?
Dennis

21

Tôi nghĩ rằng điều này có thể trả lời câu hỏi của bạn.

Phương thức không tĩnh ..... không nên được gọi là phương thức tĩnh

Nếu phương thức không phải là tĩnh, bạn cần khởi tạo nó như sau:

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

Hoặc, trong PHP 5.4+, bạn có thể sử dụng cú pháp này:

(new ClassName)->method();

Is (new ClassName) -> method (); cũng tương thích với PHP 5.3?
Jeff

1
@ Jeff, tôi muốn sử dụng (new ClassName())->method();, và tôi tin rằng nó là tương thích với PHP 5-7
Dennis

1
(new ClassName)->method();không tương thích với PHP 5.3. Tôi chỉ thử nó.
Sonny

1

Thử cái này:

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

Nó đã làm việc cho tôi trong một trường hợp tương tự.


1

sử dụng className-> function (); thay vào đó className :: function ();


0

return falsethường có nghĩa là kết thúc việc tạo đối tượng với một thất bại. Nó đơn giản như vậy.


0

Nếu độ phân giải phạm vi :: phải được sử dụng bên ngoài lớp thì hàm hoặc biến tương ứng phải được khai báo là tĩnh

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
Bạn có thể cung cấp các ví dụ cho OP và tất cả các du khách trong tương lai không?
B001 ᛦ

<? php class Foo {/ * Biến tĩnh * / public static $ static_var = 'static variable'; / * Hàm tĩnh * / static function staticValue () {return 'static function'; } / * function * / function Value () {return 'Đối tượng'; }} echo Foo :: $ static_var. "<br/>"; echo Foo :: staticValue (). "<br/>"; $ foo = new Foo (); echo $ foo-> Value (); / * Hy vọng ví dụ này sẽ giúp ích cho bạn * /
Ravi Krishnan

-1

Thay vì sử dụng cá thể với toán tử phân giải phạm vi :: bởi vì nó không được định nghĩa giống như hàm tĩnh.

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

thay đổi nó thành:

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

Và nó sẽ hoạt động như một lá bùa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.