<?php
class mybase {
protected static $sName = '';
function __construct(){
}
public static function iGetTotal($sql=''){
echo "{self::$sName}".PHP_EOL;
}
}
class CTest extends mybase {
protected static $sName = 'Peter';
function __construct(){
echo "CTest construct".PHP_EOL;
}
}
$d = CTest::iGetTotal();
這如果要依照你要要求,會有難度。
畢竟你的 Peter 是放在CTest內。
而且還只是宣告變數,未給與變值。
不去改動這支程式碼。我實在想不到可改變的方式。
唯一能想到的是外部給值的方式。
只是我也不確定這是不是你要的。
本來想學 Laravel 的資料庫設定方式, 如果 CTest 是 db model, 是否只要在 CTest 內設定, 就可以使用 mybase 內的 iGetTotal, 並將 $sName 帶過去.
一般的思考點,可以在mybase內做個set的動作來處理。
這樣的話。就可以在你的CTest去將參數運行set處理就好。
只是動作參數與宣告我會分開處理。
基本上宣告的參數給的值,我只會將其當成預設值處理。
還是會規劃一個給值的方式處理。
大多數給值我都會寫在 __construct 內。如果共用性高的話。
後來想想, 改為以下方式! 但是不知道是否為最佳解答?!
<?php
trait mybase {
protected function __construct(){}
public static function iGetTotal(){
print self::$sName.PHP_EOL;
}
}
class CTest {
use mybase;
public static $sName = 'Peter';
public function __construct(){
parent::__construct();
}
}
$d = CTest::iGetTotal();
突然想到。可以改這樣試試
public static function iGetTotal($sql=''){
$sName = static::$sName;
echo "{$sName}".PHP_EOL;
}
或是這樣:
<?php
trait ActionBase {
public function iGetTotal(){
print $this->sName.PHP_EOL;
}
}
class CBase {
protected $sName = '';
public function __construct($name){
$this->sName = $name;
}
}
class CTest extends CBase {
use ActionBase;
}
$d = new CTest('Peter');
$d->iGetTotal();
?>