将一个类作为函数参数传递

35

我想做类似这样的事情:

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

$someVar = doSomething($param, Class);

这可行吗?

为了更好地解释我要做的事情,我在Laravel中有一个帮助函数用于生成唯一的slug,因此我必须查询不同的表,具体取决于slug将要保存的位置。

我正在尝试编写的实际代码:

$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'),然后使用 $class::somefunction() - Marc B
我从你的例子中并没有真正理解。你能否再具体地解释一下? - Alex
1
您正在尝试动态调用静态方法,这基本上是一个设计缺陷。使用@Marc B的字符串建议是可能的,但更好的方法是使用实例方法和function doSomething($param, MyBaseClass $instance) { $instance->someFunction(); } - Kenney
但是我该如何调用你的示例中的函数呢?像这样吗? $instance = new MyBaseClass; doSomething($param, $instance) ? - Alex
4个回答

53

你可以使用魔术常量 ::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);

17
在PHP中,类(或类名)被处理为字符串。从PHP 5.5版本开始,您可以使用YourClass::class来获取完全限定的类名。 如果您希望在更早版本的PHP中获得它,则可以(如果已经有一个类的对象)执行以下操作:
<?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();
}
?>

啊,我不知道接口可以在名称上使用类型提示。这正是我需要的,以确保意图不被遗忘。 - That Realty Programmer Guy

4
我认为你可以。
将类名作为字符串参数发送,然后按下面的方式使用它。
$classtr = "yourparam";// param comes from the function call.

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

1

将类名作为字符串参数发送,需要使用命名空间。例如:

function defineClass()
{
  $class = "App\MyClass"; // mention the namespace too
}

function reciveClass($class)
{
   $class:: // what do you need,
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接