簡體   English   中英

PHP:我怎么知道一個變量是否是“::class”?

[英]PHP: how do I know if a variable is a "::class?"

我有 PHP 代碼,它將參數作為User::class傳遞,然后用new $p實例化。

但我還需要能夠向它傳遞一個查詢實例......一個具體實例,當然,它也是一個對象......它是一個類的成員。

因此,如何檢測變量的值是否是使用::class命名法創建的?


一個小小的單線暗示了一個答案:

$ php -r 'class foo {}; print gettype(foo::class);'
string

這個假設正確嗎? 一個對象實例(例如一個查詢)將是object類型,而::class構造將是string 我剛剛回答了我自己的問題嗎?


為了澄清,我的代碼想要這樣做:

 if (gettype($q) == 'string') {
   $query = new $q();      // must be '::class' (TRUE in my situation tho' not generally)
 } else {                  // (so, the only other possibility in my case is 'object')
   $query = $q;            // existing object instance
 }

...在我的特定情況下,我知道參數將始終是一個或另一個。 我不需要通用的解決方案。

foo::class是一個字符串,它與其他字符串沒有區別。

class_exists函數可以幫助您:

    var_dump(class_exists(foo::class));

結果:真

以下是您的選擇:

class Foo {
}

$foo = new Foo;

is_object($foo); // $foo is an object

is_string($foo); // No, $foo isn't a string

$foo instanceof Foo // $foo is an instance of Foo

is_string(Foo::class) // Foo::class is a string just like any other string

get_class($foo) // returns 'Foo'

class_exists('Foo') // returns true if class Foo can be found

foo::class調用返回類名的字符串。 您可以實例化一個對象並為它提供一個變量,如下所示:

$p = foo::class;
$query = new QueryThing();
$obj = new $p($query);

你可以這樣做看看你有什么類型的課程

get_class($p) // returns "foo"
$p instanceof foo // returns true

但是您無法知道您的對象是從foo::class調用動態實例化的。

沒有人趕緊告訴我我錯了,我會說“是的,為了我的目的,我確實回答了我自己的問題。” (我編輯了原始問題以顯示我的想法。)

你可以拍攝instanceof

if($q instanceof Foo){
    echo "Here do the things you need with your class";
} else {
    echo "Assume it is a string?";
}

我建議的另一個選擇是確保通過類型提示獲得您期望的數據。

function bar(Foo $foo){
    //foo has to be Foo class or exception will be thrown.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM