PHP में :: क्लास क्या है?


102

::classPHP में नोटेशन क्या है ?

एक त्वरित Google खोज सिंटैक्स की प्रकृति के कारण कुछ भी नहीं देता है।

बृहदान्त्र बृहदान्त्र वर्ग

इस नोटेशन का उपयोग करने से क्या फायदा है?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];

जवाबों:


87

यह फीचर PHP 5.5 में लागू किया गया था।

दस्तावेज़: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

यह 2 कारणों से बहुत उपयोगी है।

  • अब आपको अपने क्लास के नाम स्ट्रिंग्स में स्टोर करने की ज़रूरत नहीं है। जब आप अपने कोड को रिफलेक्टर करते हैं, तो कई IDE इन वर्ग नामों को पुनः प्राप्त कर सकते हैं
  • आप useअपनी कक्षा को हल करने के लिए कीवर्ड का उपयोग कर सकते हैं और आपको पूर्ण कक्षा का नाम लिखने की आवश्यकता नहीं है।

उदाहरण के तौर पर :

use \App\Console\Commands\Inspire;

//...

protected $commands = [
    Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];

अपडेट :

यह सुविधा लेट स्टेटिक बाइंडिंग के लिए भी उपयोगी है ।

__CLASS__मैजिक स्थिरांक का उपयोग करने के बजाय , आप static::classअभिभावक वर्ग के अंदर व्युत्पन्न वर्ग का नाम प्राप्त करने के लिए सुविधा का उपयोग कर सकते हैं । उदाहरण के लिए:

class A {

    public function getClassName(){
        return __CLASS__;
    }

    public function getRealClassName() {
        return static::class;
    }
}

class B extends A {}

$a = new A;
$b = new B;

echo $a->getClassName();      // A
echo $a->getRealClassName();  // A
echo $b->getClassName();      // A
echo $b->getRealClassName();  // B

1
एक मामूली सुधार: पहले उदाहरण में, Inspire::class"App \ Console \ Commands \ Inspire" के बराबर है, बिना पिछड़े सुस्त उपसर्ग के।
जेसन

1
@ फैबियनहेड्डी: ध्यान दें कि दो नोटेशन use \App\...और use App\...अनुमत हैं। मैं एक उप-नामस्थान में निहित वर्ग और वर्तमान नाम स्थान पदानुक्रम के बाहर एक वर्ग के बीच अंतर बनाने के लिए इसका उपयोग करता हूं।
अल्पाक्ष

चेतावनी का एक शब्द, आप कुछ भी लिख सकते हैं और फिर भी "वर्ग" नाम प्राप्त कर सकते हैं। मैं SomeDumbCrapThatDoesntExist :: क्लास टाइप कर सकता हूं और अगर आईडीई इसे नहीं पकड़ता है तो यह मुझे कोई त्रुटि या चेतावनी नहीं देगा। टाइपो बनाना आसान है और यह याद आती है।
गेब्रियल अलैक

19

class विशेष है, जो पूरी तरह से योग्य वर्ग नाम प्राप्त करने के लिए php द्वारा प्रदान किया गया है।

Http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name देखें ।

<?php

class foo {
    const test = 'foobar!';
}

echo foo::test; // print foobar!

क्या कोई कारण है कि लारवेल ने इसे स्विच करने का फैसला किया?
यदा

7
यह इंसपायर वर्ग पर एक स्थिर नहीं है। यह php द्वारा प्रदान किया गया एक स्थिरांक है। यह पूरी तरह से योग्य वर्ग नाम प्राप्त करने का एक त्वरित तरीका है। php.net/manual/en/…
jfadich

1
@ यादा मेरा मानना ​​है कि लारवेल के पीछे तर्क यह है कि यह आपको टाइपो बनाने के लिए एक कम जगह देता है। आप एक ही चीज़ प्राप्त करने के लिए स्ट्रिंग '\ App \ Console \ Commands \ Inspire' या Inspire :: क्लास का उपयोग कर सकते हैं, लेकिन आपका IDE बाद में सिंटैक्स / वर्तनी त्रुटियों को पकड़ लेगा, जिससे डीबग करना थोड़ा आसान हो जाता है।
jfadich

1

यदि आप उत्सुक हैं कि कौन सी श्रेणी में ::classआती है, (चाहे वह भाषा का निर्माण हो, आदि), यह बहुत सरल है। यह एक स्थिर है । PHP इसे "विशेष स्थिरांक" कहता है। यह विशेष है क्योंकि यह PHP द्वारा प्रदान किया गया है।

https://www.php.net/manual/en/language.oop5.constants.php


0

कृपया निम्नलिखित का उपयोग करने के लिए जागरूक रहें:

if ($whatever instanceof static::class) {...}

यह एक सिंटैक्स त्रुटि फेंक देगा:

unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'

लेकिन आप इसके बजाय निम्नलिखित कर सकते हैं:

if ($whatever instanceof static) {...}

या

$class = static::class;
if ($whatever instanceof $class) {...}

गतिशील हैकिंग के लिए यह हैक, php से 5. * काम करता है$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
व्लादिमीर च
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.