web-dev-qa-db-fra.com

Passer une classe en tant que paramètre de fonction

J'essaie de faire quelque chose comme ça:

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

$someVar = doSomething($param, Class);

C'est possible?

Pour mieux expliquer ce que j'essaie de faire. J'ai une fonction d'aide dans Laravel pour générer des slugs uniques, je dois donc interroger différentes tables en fonction de l'endroit où le slug va être enregistré.

Le code actuel que j'essaye d'écrire:

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

Merci!

14
Alex

Vous pouvez utiliser la constante magique ::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);
23
Joseph Silber

En PHP, les classes (ou noms de classe) sont traitées comme des chaînes. Depuis PHP 5.5 , vous pouvez utiliser YourClass::class pour obtenir un nom de classe qualifié complet . Si vous voulez le récupérer dans une version antérieure de php, vous les calss) soit procédez comme suit:

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

$clazz = get_class($obj);
?>

ou, vous pouvez implémenter une méthode statique dans votre classe, comme ceci:

<?php

class YourClass {
    // some code

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

Si vous voulez passer une classe à une fonction, vous pouvez le faire comme ceci:

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

ou

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

Si vous devez appeler une méthode non statique de cette classe, vous devez l'instancier:

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

Remarque: Vous pouvez utiliser l'indicateur de type PHP avec les noms de classe transmis:

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

Je pense que tu peux.

Envoyez le nom de la classe en tant que paramètre de chaîne puis utilisez-le comme ci-dessous.

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

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

Envoyez le nom de la classe en tant que paramètre de chaîne dont vous avez besoin pour utiliser l'espace de noms. Par exemple:

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

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