【问题标题】:Passing a class as function parameter将类作为函数参数传递
【发布时间】:2015-09-16 17:09:16
【问题描述】:

我正在尝试做这样的事情:

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

谢谢!

【问题讨论】:

  • 将其作为字符串传递? doSomething($param, 'PDO'); 然后$class::somefunction()?
  • 我并没有从你的例子中真正理解。能不能说的清楚一点?
  • 您正在尝试动态调用静态方法,这基本上是一个设计缺陷。 @Marc B 的字符串建议是可能的,但更好的是使用实例方法和function doSomething($param, MyBaseClass $instance) { $instance->someFunction(); }
  • 但是在您的示例中如何调用该函数?像这样的东西? $instance = new MyBaseClass; doSomething($param, $instance) ?

标签: php laravel laravel-5 laravel-5.1


【解决方案1】:

你可以使用神奇的::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);

【讨论】:

    【解决方案2】:

    在 PHP 中,类(或类名)作为字符串处理。 从 PHP 5.5 开始,您可以使用 YourClass::class 来获取完全限定的类名。 如果您想在早期版本的 php 中获取它,您可以(如果您已经有 cals 的对象)执行以下操作:

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

    【讨论】:

      【解决方案3】:

      我想你可以。

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

      $classtr = "yourparam";// param comes from the function call.
      
      $obj = new $classtr;
      $obj->method();
      

      【讨论】:

        【解决方案4】:

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

        function defineClass()
        {
          $class = "App\MyClass"; // mention the namespace too
        }
        
        function reciveClass($class)
        {
           $class:: // what do you need,
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-18
          • 2018-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-06
          • 2021-04-13
          相关资源
          最近更新 更多