我试图做这样的事情:
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;
}
谢谢!
答案 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,
}