it-swarm.com.de

Eine Klasse als Funktionsparameter übergeben

Ich versuche so etwas zu tun:

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

$someVar = doSomething($param, Class);

Ist es möglich?

Um besser zu erklären, was ich versuche. Ich habe eine Hilfsfunktion in Laravel, um eindeutige Slugs zu generieren. Daher muss ich verschiedene Tabellen abfragen, je nachdem, wo der Slug gespeichert werden soll.

Tatsächlicher Code, den ich zu schreiben versuche:

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

Vielen Dank!

14
Alex

Sie können die magische ::class-Konstante verwenden:

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);
23
Joseph Silber

In PHP werden Klassen (oder Klassennamen) als Zeichenfolgen behandelt. Seit PHP 5.5 können Sie YourClass::class verwenden, um einen vollständig qualifizierten Klassennamen zu erhalten . Wenn Sie ihn in einer früheren Version von PHP erhalten möchten, können Sie (falls Sie bereits ein Objekt von haben die calss) tun entweder Folgendes:

<?php
$obj = new YourClass();
// some code

$clazz = get_class($obj);
?>

oder Sie können eine statische Methode in Ihrer Klasse wie folgt implementieren:

<?php

class YourClass {
    // some code

    public static function getClassName() {
        return get_called_class();
    }
?>

Wenn Sie eine Klasse an eine Funktion übergeben möchten, können Sie dies folgendermaßen tun:

<?php
function do_somthing($arg1, $clazz) {
    $clazz::someStaticMethod($arg1);
}
?>

oder

<?php
function do_somthing($arg1, $clazz) {
    call_user_func(array($clazz, 'someStaticMethod')), $arg1);
}
?>

Wenn Sie eine nicht statische Methode dieser Klasse aufrufen müssen, müssen Sie sie instanziieren:

<?php
function do_somthing($arg1, $clazz) {
    $obj = new $clazz(); 
    $obj->someNonStaticMethod();
}
?>

Hinweis: Sie können den Typ PHP mit übergebenen Klassennamen verwenden:

<?php
function do_somthing($arg1, MyInterface $clazz) {
    $obj = new $clazz(); 
    $obj->someInterfaceMethod();
}
?>
9
kije

Ich glaube du kannst.

Senden Sie den Klassennamen als String-Parameter und verwenden Sie ihn wie folgt.

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

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

Senden Sie den Klassennamen als String-Parameter, den Sie benötigen, über den Namespace. Zum Beispiel:

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

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