আমি কীভাবে পিএইচপি-তে ক্লাসের নাম পাই?


103
public class MyClass {

}

জাভাতে আমরা ক্লাসের নাম সহ পেতে পারি String className = MyClass.class.getSimpleName();

পিএইচপি এ কীভাবে করবেন? আমি ইতিমধ্যে জানি get_class(), কিন্তু এটি কেবল বস্তুর জন্য কাজ করে। বর্তমানে আমি অ্যাক্টিভ রেকর্ডে কাজ করি। আমি বিবৃতি প্রয়োজন MyClass::className


4
যখন আপনি পিএইচপি সাহায্য করতে পারেন আপনি একটি নির্দিষ্ট উদাহরণ দিতে পারেন? আপনি যদি ক্লাসের নামটি হার্ডকোড করে রেখেছেন - আপনি এটিকে উদ্ধৃতিতে গুটিয়ে রাখতে পারেন এবং যা চান তা পেতে পারেন।
zerkms

4
দুর্ভাগ্যক্রমে রেনামক্লাসের মতো স্বয়ংক্রিয় রিফ্যাক্টরিংগুলি (যেমন আইডিইগুলিতে) সাধারণত শ্রেণীর নামের স্ট্রিংগুলির নাম পরিবর্তন করে না। সুতরাং public $__CLASS__ = __CLASS__;অন্য শ্রেণীর সাথে নাচ করা বাদ দিয়ে ক্লাসের নাম পাওয়ার কোনও ধরণের স্থিতিশীল উপায় থাকলে ভাল লাগবে ...
এরিকশাফার

উত্তর:


119

পিএইচপি 5.5 যেহেতু আপনি ক্লাসনেম :: শ্রেণীর মাধ্যমে ক্লাস নাম রেজোলিউশন ব্যবহার করতে পারেন ।

পিএইচপি 5.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();

?>

পিএইচপি-র পুরানো সংস্করণগুলির জন্য , আপনি get_class () ব্যবহার করতে পারেন ।


4
মধ্যে পার্থক্য কি static::classএবং get_class_name()?
আলেকজান্ডার জাঙ্ক

4
@ আলেকজান্ডারজ্যাঙ্ক দেখে মনে হচ্ছে static::classসংকলনের সময় এটি সমাধান হয়েছে যখন get_class_name()রানটাইমের সময় ব্যাখ্যা করা হয়েছে। (?) আমি :: একটি পরিবর্তনশীল উত্পন্ন ক্লাসের বর্গ সম্পত্তি অ্যাক্সেস করার চেষ্টা এবং নিম্নলিখিত ত্রুটি পেয়ে এই খুঁজে পাওয়া যায় নি: Dynamic class names are not allowed in compile-time ::class fetch। আরও তথ্যের জন্য এই উত্তর দেখুন । আমি ডক্স থেকে এই নোটটি সহায়ক বলে মনে করেছি।
সিজেসিমন

30

__CLASS__নামটি পেতে আপনি একটি শ্রেণীর মধ্যে ব্যবহার করতে পারেন ।

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


4
আপনি আকর্ষণীয় সমস্ত কনস্ট্যান্ট
MatRt

লিঙ্কটির জন্য @ ব্র্যাডকে ধন্যবাদ, আমি উত্তরটি এখানে
রেজান আছমাদ

4
@ ব্যবহারকারী 1073122, এটি আমার লিঙ্কটিতে আমি লিঙ্ক করেছি।
ব্র্যাড

+1 হিসাবে আমি প্যারেন্ট ক্লাসে সংজ্ঞায়িত এমন পদ্ধতিতে ক্লাসের নাম পাওয়ার চেষ্টা করছিলাম। অন্যান্য সমাধান ( get_class($this), static::class) কেবলমাত্র সন্তানের (যা পিতামাতার প্রসারিত) শ্রেণীর নাম দেয়।
আকিনুরি

অবিরত : self::classএছাড়াও, পিতামাতার শ্রেণীর নামটি ফেরত দেবে বলে মনে হচ্ছে।
আকিনুরি

23

মনে হচ্ছে আপনি নিজের প্রশ্নের উত্তর দিয়েছেন। get_classআপনি ক্লাস নাম পাবেন। এটি প্রক্রিয়াজাতীয় এবং সম্ভবত এটিই বিভ্রান্তির কারণ ঘটছে। পিএইচপি ডকুমেন্টেশন এর জন্য একবার দেখুন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();

এটি কিছুটা সীমাবদ্ধ, কারণ আমার ক্লাসটি প্রসারিত হলে এটি এখনও 'মাইক্লাস' ফেরত আসবে। আমরা এর get_called_classপরিবর্তে ব্যবহার করতে পারি , যা তুলনামূলকভাবে নতুন বৈশিষ্ট্যযুক্ত লেট স্ট্যাটিক বাঁধনের উপর নির্ভর করে এবং পিএইচপি> = 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" 

4
এটা আমার বুঝে আসেনা. FooBar::getClassName()সর্বদা হয় 'FooBar'। আপনি যদি টাইপ করতে পারেন Product::getClassName()- তবে আপনি 'Product'পরিবর্তে পাশাপাশি টাইপ করতে পারেন ।
zerkms

7
হ্যাঁ আমি জানি .. আমি টাইপগুলি এড়াতে চাই এবং ক্লাসের নামটি পুনরায় ফ্যাক্টর করার সময় (আইডিই সরঞ্জাম সহ), আমার স্ট্রিংটি অনুসন্ধান এবং প্রতিস্থাপন করার দরকার নেই।
রেজান আছমাদ

অভিভাবক "মডেল" শ্রেণিতে আপনার যদি শিশু শ্রেণির শ্রেণির নাম ব্যবহারের প্রয়োজন হয় তবে এটি সহায়তা করতে পারে।
জেআর লৌহর্ন

9

শ্রেণীর নাম পেতে আপনি প্রতিচ্ছবি ক্লাস ব্যবহার করতে পারেন

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

যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
yivi

একেবারে বিশেষ !!! এটি একটি সুপার কিন্তু সহজ সমাধান! থ্যাঙ্কস !!!!
সাইমন ক্যাম্পাগনা

5

দেখে মনে হচ্ছে 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
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'

পিএইচপি 5.5 এর চেয়ে পুরানো জন্য


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.