2011-08-15 81 views
16

函數(實際上是另一個類的構造函數)需要一個作爲參數的對象class temp。所以我定義了interface itemp並且包含itemp $obj作爲函數參數。這很好,我必須通過class temp對象到我的功能。但是現在我想將默認值設置爲這個參數itemp $obj。如何做到這一點?還是不可能?
我會把測試代碼澄清:php函數如何將默認值設置爲對象?

interface itemp { public function get(); } 

class temp implements itemp 
{ 
    private $_var; 
    public function __construct($var = NULL) { $this->_var = $var; } 
    public function get() { return $this->_var ; } 
} 
$defaultTempObj = new temp('Default'); 

function func1(itemp $obj) 
{ 
    print "Got : " . $obj->get() . " as argument.\n"; 
} 

function func2(itemp $obj = $defaultTempObj) //error : unexpected T_VARIABLE 
{ 
    print "Got : " . $obj->get() . " as argument.\n"; 
} 

$tempObj = new temp('foo'); 

func1($defaultTempObj); //Got : Default as argument. 
func1($tempObj); //Got : foo as argument. 
func1(); //error : argument 1 must implement interface itemp (should print Default) 
//func2(); //could not test as i can't define it 
+0

你可以在這種情況下,用我的小庫[ValueResolver(https://github.com/LapaLabs/ValueResolver),檢查我的回答,請 –

回答

26

你不能。但是你可以很容易地做到這一點:

function func2(itemp $obj = null) 
    if ($obj === null) { 
     $obj = new temp('Default'); 
    } 
    // .... 
} 
+0

謝謝[發現這個(HTTP: // stackoverflow.com/questions/2224014/php-default-function-argument-as-a-t-variable/2224044#2224044)搜索php方法默認值後,沒有想到我可以將對象與空值進行比較。 – Sudhi

3

一個可能的問題與arnaud576875的回答是,在某些情況下,你可能希望允許NULL爲指定的參數,例如你可能希望爲以下不同的處理:

func2(); 
func2(NULL); 

如果是一個更好的解決辦法是:

function func2(itemp $obj = NULL) 
{ 

    if (0 === func_num_args()) 
    { 
    $obj = new temp('Default'); 
    } 

    // ... 

} 
+1

這有意義嗎?唯一有效的參數值是'null'和'itemp'的實現。從API角度來看(或者至少應該是這樣),在爲缺少值('null')傳遞標記時沒有任何行爲差異,並且根本沒有值。我同意,如果該參數不會被打印出來,在某些情況下這實際上是有用的。 – Rangad

+1

如果你沒有傳遞一個參數,那麼你是故意這樣做的,所以你可能希望它執行一些默認行爲。如果你傳遞一個'NULL'參數,那麼它可能期待'itemp'實現,所以你可能希望它記錄一個錯誤和/或拋出一個異常。 – MichaelRushton

+0

鬼鬼祟祟的,這樣你就引入了一些重載到PHP。我喜歡。不知道我是否贊同它,但誰在乎...... :) – VolkerK

0

你可以用我的小圖書館ValueResolver在這種情況下,例如:

function func2(itemp $obj = null) 
    $obj = ValueResolver::resolve($obj, new temp('Default')); 
    // .... 
} 

,不要忘記使用命名空間use LapaLabs\ValueResolver\Resolver\ValueResolver;

有還能力的類型轉換,例如,如果你的變量的值應該是integer,所以用這個:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6 
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value) 

檢查docs更多的例子

0

因爲php 5.5,你可以簡單地使用::class傳遞一個類作爲參數如下:

function func2($class = SomeObject::class) { 
    $object = new $class; 
} 

func2(); // will create an instantiation of SomeObject class 
func2(AnotherObject::class); // will create an instantiation of the passed class