Saya memiliki php berikut. Namun ketika saya melihat index.php saya mendapatkan pesan kesalahan berikut.
Standar ketat: Metode non-statis Page :: getInstanceByName () tidak boleh dipanggil secara statis di /var/www/webworks/index.php pada baris 12
Saya berharap seseorang dapat memberi tahu saya cara memperbaiki masalah.
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];
}
php
static-members
tulang kering
sumber
sumber
Jawaban:
Metode Anda kehilangan
static
kata kunci . Perubahanuntuk
jika Anda ingin memanggilnya secara statis.
Perhatikan bahwa metode statis (dan Singletons ) adalah kematian bagi kemampuan pengujian .
Perhatikan juga bahwa Anda melakukan terlalu banyak pekerjaan di konstruktor, terutama semua kueri yang seharusnya tidak ada di sana. Yang harus dilakukan oleh konstruktor Anda adalah menyetel objek ke status yang valid. Jika Anda harus memiliki data dari luar kelas untuk melakukan itu, pertimbangkan untuk memasukkannya daripada menariknya. Perhatikan juga bahwa konstruktor tidak dapat mengembalikan apa pun. Mereka akan selalu mengembalikan kekosongan sehingga semua
return false
pernyataan ini tidak melakukan apa-apa selain mengakhiri konstruksi.sumber
public
kata kunci hanya digunakan dalam deklarasi fungsi / variabel dari dalam kelas. Lihat stackoverflow.com/questions/13341378/…static
, daripada menulis (ulang) kode untuk digunakan$p = new Page(); $p->getInstanceByName();
?Saya pikir ini mungkin menjawab pertanyaan Anda.
Metode non-statis ..... tidak boleh dipanggil secara statis
Jika metode ini tidak statis Anda perlu menginisialisasi seperti ini:
Atau, di PHP 5.4+, Anda dapat menggunakan sintaks ini:
sumber
(new ClassName())->method();
, dan saya yakin ini kompatibel dengan PHP dari 5 hingga 7(new ClassName)->method();
tidak kompatibel dengan PHP 5.3. Saya baru mencobanya.Coba ini:
Itu berhasil untuk saya dalam kasus serupa.
sumber
gunakan className-> function (); sebagai gantinya className :: function ();
sumber
return false
biasanya dimaksudkan untuk menghentikan pembuatan objek dengan kegagalan. Sesederhana itu.sumber
Jika scope resolution :: harus digunakan di luar kelas maka masing-masing fungsi atau variabel harus dideklarasikan sebagai statis
sumber
Alih-alih menggunakan instance dengan operator resolusi lingkup :: karena tidak didefinisikan seperti fungsi statis.
ubah menjadi:
Dan itu akan bekerja seperti pesona.
sumber