2015-09-16 161 views
3

我試圖做這樣的事情:傳遞一個類,函數參數

function doSomething($param, Class) { 
Class::someFunction(); 
} 

$someVar = doSomething($param, Class); 

這可能嗎?

更好地解釋我想要做的事情。我在Laravel有一個幫助函數來生成獨特的slu,,所以我必須根據slu where將被保存的位置來查詢不同的表格。

實際的代碼我試圖寫:

$newcat->slug = $helper->uniqueSlug($appname, Apk); 

public function uniqueSlug($str, Apk) 
    { 
     $slug = Str::slug($str); 

     $count = Apk::whereRaw("slug RLIKE '^{$slug}(-[0-9]+)?$'")->count(); 

     return $count ? "{$slug}-{$count}" : $slug; 
    } 

謝謝!

+2

將它作爲字符串傳遞? 'doSomething($ param,'PDO');'then'$ class :: somefunction()'? –

+0

我從你的例子中沒有真正理解。你能不能更清楚些? – Alex

+1

您試圖動態調用靜態方法,這基本上是一個設計缺陷。這可能是@Marc B的字符串建議,但更好的方法是使用實​​例方法和函數doSomething($ param,MyBaseClass $ instance){$ instance-> someFunction(); }' – Kenney

回答

8

可以使用魔法::class常數:

public function uniqueSlug($str, $model) 
{ 
    $slug = Str::slug($str); 

    $count = $model::whereRaw("slug RLIKE '^{$slug}(-[0-9]+)?$'")->count(); 

    return $count ? "{$slug}-{$count}" : $slug; 
} 

$newcat->slug = $helper->uniqueSlug($appname, Apk::class); 
+0

這很好用! – Alex

+0

我有一個非常[類似的問題](http://stackoverflow.com/questions/41114815/how-can-i-pass-multiple-objects-to-the-function),如果你有一些空閒時間,請看看它。 – stack

2

我認爲你可以。

發送類名稱作爲字符串參數,然後像下面那樣使用它。

$classtr = "yourparam";// param comes from the function call. 

$obj = new $classtr; 
$obj->method(); 
4

在PHP中,類(或類名)被作爲字符串處理。 從PHP 5.5開始,您可以使用YourClass::class來獲取完全限定的類名稱。 如果你想獲得它在PHP的早期版本,您可以(如果你已經在CALSS的對象)要麼做到以下幾點:

<?php 
$obj = new YourClass(); 
// some code 

$clazz = get_class($obj); 
?> 

或者,你可以在類中實現靜態方法,像這樣:

<?php 

class YourClass { 
    // some code 

    public static function getClassName() { 
     return get_called_class(); 
    } 
?> 

如果你想一類傳遞給一個函數,你可以這樣說:

<?php 
function do_somthing($arg1, $clazz) { 
    $clazz::someStaticMethod($arg1); 
} 
?> 

<?php 
function do_somthing($arg1, $clazz) { 
    call_user_func(array($clazz, 'someStaticMethod')), $arg1); 
} 
?> 

如果需要調用類的非靜態方法,你需要實例化它:

<?php 
function do_somthing($arg1, $clazz) { 
    $obj = new $clazz(); 
    $obj->someNonStaticMethod(); 
} 
?> 

注:您可以使用PHP類型提示與傳遞的類名:

<?php 
function do_somthing($arg1, MyInterface $clazz) { 
    $obj = new $clazz(); 
    $obj->someInterfaceMethod(); 
} 
?>