web-dev-qa-db-ja.com

クラスを関数パラメーターとして渡す

私はこのようなことをしようとしています:

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

$someVar = doSomething($param, Class);

出来ますか?

私がやろうとしていることをより良く説明するために。 Laravelにヘルパー関数があり、一意のスラッグを生成するため、スラッグの保存場所に応じて異なるテーブルをクエリする必要があります。

私が書いている実際のコード:

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

ありがとう!

17
Alex

マジック::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);
26
Joseph Silber

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

できると思う。

クラス名を文字列パラメーターとして送信し、以下のように使用します。

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

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

名前空間を使用する必要がある文字列パラメーターとしてクラス名を送信します。例えば:

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

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