将类作为函数参数

时间:2015-09-16 17:09:17

标签: php laravel laravel-5 laravel-5.1

我试图做这样的事情:

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;
    }

谢谢!

4 个答案:

答案 0 :(得分:23)

您可以使用魔法::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);

答案 1 :(得分:10)

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

答案 2 :(得分:3)

我认为你可以。

将类名作为字符串参数发送,然后像下面一样使用它。

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

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

答案 3 :(得分:0)

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

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

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