मुझे PHP में क्लास का नाम कैसे मिलेगा?


100
public class MyClass {

}

जावा में, हम क्लास का नाम प्राप्त कर सकते हैं String className = MyClass.class.getSimpleName();

PHP में यह कैसे करें? मैं पहले से ही जानता हूं get_class(), लेकिन यह केवल वस्तुओं के लिए काम करता है। वर्तमान में मैं एक्टिव रिकॉर्ड में काम करता हूं। मुझे वक्तव्य की आवश्यकता है MyClass::className


1
क्या आप एक विशेष उदाहरण दे सकते हैं जब यह php में सहायक हो सकता है? यदि आपने क्लासनाम को हार्डकोड किया है - आप इसे उद्धरणों में लपेट सकते हैं और जो चाहें प्राप्त कर सकते हैं।
झटके

2
दुर्भाग्य से ऑटोमैटिक रिफैक्टरिंग (जैसे IDEs में) RenameClass की तरह आमतौर पर ऐसे क्लास नेम स्ट्रिंग्स का नाम नहीं बदला। इसलिए क्लास के नाम को पाने के लिए हर तरह का स्टैटिक तरीका अच्छा होगा, एक तरफ public $__CLASS__ = __CLASS__;हर दूसरे क्लास के साथ डांस करने से ...
EricSiplefer

जवाबों:


115

PHP 5.5 के बाद से आप ClassName :: class के माध्यम से वर्ग नाम रिज़ॉल्यूशन का उपयोग कर सकते हैं ।

PHP5.5 की नई विशेषताएं देखें ।

<?php

namespace Name\Space;

class ClassName {}

echo ClassName::class;

?>

यदि आप अपनी कक्षा विधि में इस सुविधा का उपयोग करना चाहते हैं तो स्थैतिक :: वर्ग का उपयोग करें :

<?php

namespace Name\Space;

class ClassName {
   /**
    * @return string
    */
   public function getNameOfClass()
   {
      return static::class;
   }
}

$obj = new ClassName();
echo $obj->getNameOfClass();

?>

PHP के पुराने संस्करणों के लिए , आप get_class () का उपयोग कर सकते हैं ।


5
बीच क्या अंतर है static::classऔर get_class_name()?
अलेक्जेंडर जान

1
@AlexanderJank ऐसा लगता है जैसे static::classसंकलित समय के दौरान हल किया गया है जबकि get_class_name()रनटाइम के दौरान व्याख्या की गई है। मैंने इसे गतिशील रूप से उत्पन्न वर्ग की :: वर्ग की संपत्ति (?) तक पहुँचने की कोशिश करके पाया और निम्नलिखित त्रुटि प्राप्त की Dynamic class names are not allowed in compile-time ::class fetch:। अधिक विवरण के लिए यह उत्तर देखें। मुझे यह नोट भी डॉक्स से मददगार लगा।
cjsimon

29

आप __CLASS__नाम प्राप्त करने के लिए एक वर्ग के भीतर उपयोग कर सकते हैं ।

http://php.net/manual/en/language.constants.predefined.php


3
आप सभी दिलचस्प कॉन्स्ट देखने के लिए यहां भी नज़र डाल सकते हैं: php.net/manual/en/language.constants.predefined.php
MatRt

लिंक के लिए @ ब्रैड की बदौलत, मुझे यहाँ
रेज़न अचमद

2
@ user1073122, यह वह लिंक है जिसे मैंने अपने उत्तर में लिंक किया है।
ब्रैड

+1 जैसा कि मैं एक विधि में वर्ग नाम प्राप्त करने की कोशिश कर रहा था जो कि मूल कक्षा में परिभाषित किया गया है। अन्य समाधान ( get_class($this), static::class) बस बच्चे को वापस करता है (जो माता-पिता का विस्तार करता है) वर्ग नाम।
एकिनवरी २ a ’१

जारी :, self::classभी, मूल वर्ग नाम वापस करने के लिए लगता है।
अकिनुरी २ a ’१

23

ऐसा लगता है कि आपने अपने प्रश्न का उत्तर दिया। get_classआपको क्लास का नाम मिल जाएगा। यह प्रक्रियात्मक है और शायद यही कारण है कि भ्रम पैदा कर रहा है। के लिए php प्रलेखन पर एक नज़र डालेंget_class

यहाँ उनका उदाहरण दिया गया है:

 <?php

 class foo 
 {
     function name()
     {
         echo "My name is " , get_class($this) , "\n";
     }
 }

 // create an object
 $bar = new foo();

 // external call
 echo "Its name is " , get_class($bar) , "\n"; // It's name is foo

 // internal call
 $bar->name(); // My name is foo

इसे अपने उदाहरण की तरह बनाने के लिए आप कुछ ऐसा कर सकते हैं:

 <?php

 class MyClass
 {
       public static function getClass()
       {
            return get_class();
       }
 }

अब आप कर सकते हैं:

 $className = MyClass::getClass();

हालांकि, यह कुछ हद तक सीमित है, क्योंकि यदि मेरी कक्षा को बढ़ाया जाता है, तो यह अभी भी 'MyClass' को लौटाएगा। हम get_called_classइसके बजाय उपयोग कर सकते हैं , जो लेट स्टेटिक बाइंडिंग पर निर्भर करता है , अपेक्षाकृत नई सुविधा है, और इसके लिए PHP> = 5.3 की आवश्यकता होती है।

<?php

class MyClass
{
    public static function getClass()
    {
        return get_called_class();
    }

    public static function getDefiningClass()
    {
        return get_class();
    }
}

class MyExtendedClass extends MyClass {}

$className = MyClass::getClass(); // 'MyClass'
$className = MyExtendedClass::getClass(); // 'MyExtendedClass'
$className = MyExtendedClass::getDefiningClass(); // 'MyClass'

धन्यवाद @ जे। विचार के लिए। लेकिन यह विरासत में काम नहीं करता है।
रेजन अचमद

11

अब, मेरी समस्या का उत्तर है। लिंक के लिए ब्रैड का धन्यवाद , मुझे यहां जवाब मिल गया है । और विचार के लिए जे.मोनी का धन्यवाद । मेरा समाधान:

<?php

class Model
{
    public static function getClassName() {
        return get_called_class();
    }
}

class Product extends Model {}

class User extends Model {}

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 

3
इसका कोई मतलब नही बनता। FooBar::getClassName()हमेशा होता है 'FooBar'। यदि आप टाइप कर सकते हैं Product::getClassName()- तो आप 'Product'इसके बजाय टाइप कर सकते हैं ।
झटके

7
हां मुझे पता है .. मैं टाइपो से बचना चाहता हूं और वर्ग के नाम (आईडीई टूल के साथ) को री-फैक्टर करने पर भी, मुझे स्ट्रिंग को खोजने और बदलने की आवश्यकता नहीं है।
रेजन अचमद

यह भी मदद कर सकता है यदि आपको माता-पिता "मॉडल" वर्ग में बच्चे के वर्ग के नाम का उपयोग करने की आवश्यकता है।
जेआर लॉरहॉर्न

9

क्लास का नाम पाने के लिए आप ReflectionClass का उपयोग कर सकते हैं

class MyClass {
    public function myNameIs(){
        return (new \ReflectionClass($this))->getShortName();
    }
}

हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
yivi

बिल्कुल खास !!! यह एक सुपर लेकिन सरल समाधान है! Thankss !!!!
सिमोन कैम्पागना

4

ऐसा लगता है ReflectionClassकि एक बहुत ही उत्पादक विकल्प है।

class MyClass {
    public function test() {
        // 'MyClass'
        return (new \ReflectionClass($this))->getShortName();
    }
}

बेंचमार्क:

Method Name      Iterations    Average Time      Ops/second
--------------  ------------  --------------    -------------
testExplode   : [10,000    ] [0.0000020221710] [494,518.01547]
testSubstring : [10,000    ] [0.0000017177343] [582,162.19968]
testReflection: [10,000    ] [0.0000015984058] [625,623.34059]

3

मुझे लगता है कि PHP में 'स्व' और 'स्थैतिक' के बीच थोड़ा अंतर का उल्लेख करना महत्वपूर्ण है क्योंकि 'सबसे अच्छा जवाब' 'स्थैतिक' का उपयोग करता है जो कुछ लोगों को भ्रमित परिणाम दे सकता है।

<?php
class X {
    function getStatic() {
        // gets THIS class of instance of object
        // that extends class in which is definied function
        return static::class;
    }
    function getSelf() {
        // gets THIS class of class in which function is declared
        return self::class;
    }
}

class Y extends X {
}
class Z extends Y {
}

$x = new X();
$y = new Y();
$z = new Z();

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf();

परिणाम:

X: X, X
Y: Y, X
Z: Z, X

2

end(preg_split("#(\\\\|\\/)#", Class_Name::class))

Class_Name::class: नेमस्पेस के साथ कक्षा वापस करें। इसलिए आपको केवल एक सरणी बनाने की आवश्यकता है, उसके बाद सरणी का अंतिम मान प्राप्त करें।


0
<?php
namespace CMS;
class Model {
  const _class = __CLASS__;
}

echo Model::_class; // will return 'CMS\Model'

PHP 5.5 से पुराने के लिए


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.