iT邦幫忙

0

請問有沒有什麼 PHP 的設計模式, 可以顯示 Peter? 在不改動 CTest 的狀況下?

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

1 個回答

0

這如果要依照你要要求,會有難度。
畢竟你的 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;
}
fillano iT邦超人 1 級 ‧ 2020-12-17 14:15:33 檢舉

或是這樣:

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

我要發表回答

立即登入回答