আমি কি পিএইচপি ক্লাসে কনস্টের সংজ্ঞায়িত পেতে পারি?


140

আমি কয়েকটি CONST এর কয়েকটি ক্লাসে সংজ্ঞায়িত করেছি এবং সেগুলির একটি তালিকা পেতে চাই। উদাহরণ স্বরূপ:

class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";
}

Profileক্লাসে সংজ্ঞায়িত কনস্টের তালিকা পাওয়ার কোনও উপায় আছে কি ? আমি যতদূর বলতে পারি, নিকটতম বিকল্প ( get_defined_constants()) কৌশলটি করবে না।

আমার আসলে যা দরকার তা হল ধ্রুবক নামের একটি তালিকা - এরকম কিছু:

array('LABEL_FIRST_NAME',
    'LABEL_LAST_NAME',
    'LABEL_COMPANY_NAME')

বা:

array('Profile::LABEL_FIRST_NAME', 
    'Profile::LABEL_LAST_NAME',
    'Profile::LABEL_COMPANY_NAME')

অথবা এমনকি:

array('Profile::LABEL_FIRST_NAME'=>'First Name', 
    'Profile::LABEL_LAST_NAME'=>'Last Name',
    'Profile::LABEL_COMPANY_NAME'=>'Company')

আপনি প্রতিবিম্ব ব্যবহার করে এটি করতে পারেন । উদাহরণটি দেখতে সেই পৃষ্ঠাতে "মুদ্রণ শ্রেণীর ধ্রুবকগুলি" অনুসন্ধান করুন।
n3rd

প্রতিচ্ছবি এবং সিএলে একটি রিফ্লেকশন ক্লাস ব্যবহার করে আপনি getConstants nz.php.net/manual/en/class.reflectionclass.php
টিম Ebenezer

উত্তর:


245

আপনি এর জন্য প্রতিবিম্ব ব্যবহার করতে পারেন । মনে রাখবেন যে আপনি যদি এটি অনেক কিছু করে থাকেন তবে আপনি ফলাফলটি ক্যাশে করতে চাইবেন।

<?php
class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";
}


$refl = new ReflectionClass('Profile');
print_r($refl->getConstants());

আউটপুট:

Array
(
    'LABEL_FIRST_NAME' => 'First Name',
    'LABEL_LAST_NAME' => 'Last Name',
    'LABEL_COMPANY_NAME' => 'Company'
)

4
দুটি ছোট ছোট এনবি: প্রথম, 5.3-এ, Profileপ্রতিফলক নির্মাতার পক্ষে যুক্তি হিসাবে ব্যবহার করা যেতে পারে, উদ্ধৃতি (একটি সাধারণ শ্রেণীর নাম) ছাড়াই; দ্বিতীয়ত, সম্পূর্ণরূপে পরিষ্কার হয়ে উঠতে, ফলাফলযুক্ত অ্যারের কীগুলি স্ট্রিং রয়েছে, এখানে বিন্যাস হিসাবে প্রস্তাবিত হিসাবে গ্রহণ করা যেতে পারে const (ওয়ার্থ উল্লেখ শুধুমাত্র FN হয় অনথিভুক্ত ।)
বেনজি ষোড়শ

11
@ বেঞ্জি XVI 5.3-এ যদি আপনি বিজ্ঞপ্তিগুলি চালু করে থাকেন তবে আপনি Profileউদ্ধৃতিগুলি ছাড়াই ব্যবহার করতে পারবেন না কারণ এটি নীচের ত্রুটিটি দেখায়: বিজ্ঞপ্তি: অপরিজ্ঞাত স্থির প্রোফাইলের ব্যবহার - ধরে নেওয়া 'প্রোফাইল'। সুতরাং আমি উদ্ধৃতিগুলি রাখার পরামর্শ দিচ্ছি'Profile'
টোনপ্লেক্স

10
ক্লাসের অভ্যন্তরে ধ্রুবক সম্পর্কিত যুক্তি সংজ্ঞায়িত করা ভাল, সুতরাং আপনার নির্মাণকারী যুক্তি হার্ডকোডের প্রয়োজন নেই তবে __CLASS__পরিবর্তে ব্যবহার করুন।
লুচ অ্যাডামকজেউস্কি

7
new ReflectionClass(Profile::class)খুব ভাল কাজ করে
mtizziani

@ মিটিজিয়ানী সত্য, তবে নাম স্থান সম্পর্কে সচেতন থাকুন! ধরা যাক আপনার Cityক্লাসের সাথে নেমস্পেস রয়েছে B- এখানে দুর্দান্ত B::classকাজ হবে, তবে আপনি যেমন উদাহরণস্বরূপ নেমস্পেস ব্যবহার করেন Jungle- B::classসেখানে এটি যুক্ত না করে কল করার useফলে Jungle\B(যদিও জঙ্গলের
মোটে

22

এই

 $reflector = new ReflectionClass('Status');
 var_dump($reflector->getConstants());

1
+1 এটি হবে যেহেতু ক্লাস ধ্রুবকগুলি পাওয়ার জন্য কোনও অন্তর্নিহিত পদ্ধতিগত পিএইচপি ফাংশনটি আমি খুঁজে পাই না, যা কিছুটা লজ্জার বিষয়।
বোল্টক্লক

1
সম্ভবত কারণ এটির জন্য অল্প প্রয়োজন। ওপি সেটিং দ্বারা একটি মেটা-কনফিগারেশন করতে চাইতে পারেন typesযেমন all constants this class hasবেশিরভাগ ক্ষেত্রেই, এবং আমার দেওয়া সীমিত মতে, সম্ভবত ভাল হয় উত্তরাধিকার বা ধরনের (অন্যান্য অর্থ সঙ্গে ধ্রুবক জন্য রুম ছাড়ার সঙ্গে একটি স্ট্যাটিক অ্যারে পরিবর্তনশীল সঙ্গে পরিবেশিত হয়, যা, / ব্যবহার)।
রিক্কেন

16

টোকেন_জেট_এল () ব্যবহার করুন । যথা:

<?php
header('Content-Type: text/plain');

$file = file_get_contents('Profile.php');
$tokens = token_get_all($file);

$const = false;
$name = '';
$constants = array();
foreach ($tokens as $token) {
    if (is_array($token)) {
        if ($token[0] != T_WHITESPACE) {
            if ($token[0] == T_CONST && $token[1] == 'const') {
                $const = true;
                $name = '';
            } else if ($token[0] == T_STRING && $const) {
                $const = false;
                $name = $token[1];
            } else if ($token[0] == T_CONSTANT_ENCAPSED_STRING && $name) {
                $constants[$name] = $token[1];
                $name = '';
            }
        }
    } else if ($token != '=') {
        $const = false;
        $name = '';
    }
}

foreach ($constants as $constant => $value) {
    echo "$constant = $value\n";
}
?>

আউটপুট:

LABEL_FIRST_NAME = "First Name"
LABEL_LAST_NAME = "Last Name"
LABEL_COMPANY_NAME = "Company"

1
+1, যদিও আমি বলব যে এটি অন্য পোস্টারগুলির দ্বারা উল্লিখিত প্রতিবিম্বটি ব্যবহার করার জন্য একটি দুর্দান্ত সময়, তবে "আন্ডার-দ্য-হুড" র কাজগুলি বোঝা এবং সেগুলি ছাড়া করতে সক্ষম হওয়া বা প্রয়োজনে তাদের প্রতিরূপ তৈরি করাও গুরুত্বপূর্ণ। ভাল প্রদর্শনী.
Dereleased

1
আপনি যদি না চান যে আপনার ক্লাসটি মেমরিতে লোড হয়ে যায়, টোকেন_জেট_এল একটি দুর্দান্ত বিকল্প। এটি প্রতিবিম্বের চেয়ে অনেক বেশি দ্রুত এবং আপনার প্রচুর ক্লাসের সাথে এটি করার প্রয়োজন হলে প্রক্রিয়া মেমরিটি গোলমাল করে না।
হ্যারল্ড

টোকেন-ভিত্তিক সমাধানের জন্য +1! টোকেন-ভিত্তিক পার্সিং বোঝা পারফরম্যান্স বিবেচনা করে আনন্দিত ... এবং সর্বদা এখানে একজন দুর্দান্ত ব্যক্তি আছেন যা টোকেন_জেট_এল () এর মাধ্যমে স্থির প্রতিবন্ধগুলি কীভাবে পার্স করবেন তা দেখায়। আপনাকে অনেক ধন্যবাদ!
এমওয়াত্জার

সম্ভবত এটি কেবলমাত্র একক ফাইলে কাজ করে এবং পিতামাতার ক্লাস থেকে কোনও ধরণের স্থির হয় না। প্রকৃতপক্ষে, এই কৌশলটি ক্লাস সম্পর্কেও চিন্তা করে না - এটি আপনাকে ফাইলের সমস্ত ধ্রুবক দেয়, এমনকি বিশ্বব্যাপী সুযোগও দেয়। এটি এক্সপ্লোর করার জন্য এটি দুর্দান্ত সরঞ্জাম।
জেসন


13

পিএইচপি ডক্স মন্তব্য অনুসারে, আপনি যদি প্রতিচ্ছবি ক্লাস (পিএইচপি 5) ব্যবহার করতে সক্ষম হন:

function GetClassConstants($sClassName) {
    $oClass = new ReflectionClass($sClassName);
    return $oClass->getConstants();
}

উত্স এখানে।


9

রিফ্লেকশন ক্লাস ব্যবহার করে এবং getConstants()আপনি যা চান ঠিক তা দেয়:

<?php
class Cl {
    const AAA = 1;
    const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());

আউটপুট:

Array
(
    [AAA] => 1
    [BBB] => 2
)

6

স্থিতিশীল পদ্ধতি সহ বৈশিষ্ট্য - উদ্ধার করতে হবে

দেখে মনে হচ্ছে শ্রেণীর কার্যকারিতা বাড়িয়ে তোলার জন্য স্ট্যাটিক ফাংশন সহ ট্রেইটগুলি ব্যবহার করার জন্য এটি দুর্দান্ত জায়গা। বৈশিষ্ট্যগুলিও একই কোডটি বারবার লিখে না দিয়ে আমাদের অন্য কোনও শ্রেণিতে এই কার্যকারিতাটি বাস্তবায়িত করতে দেয় (ডিআরওয়াই থাকুন)।

প্রোফাইল শ্রেণিতে আমাদের কাস্টম 'কনস্ট্যান্ট এক্সপোর্ট' বৈশিষ্ট্যটি ব্যবহার করুন। আপনার এই কার্যকারিতাটির প্রয়োজন এমন প্রতিটি শ্রেণীর জন্য এটি করুন।

/**
 * ConstantExport Trait implements getConstants() method which allows 
 * to return class constant as an assosiative array
 */
Trait ConstantExport 
{
    /**
     * @return [const_name => 'value', ...]
     */
    static function getConstants(){
        $refl = new \ReflectionClass(__CLASS__);
        return $refl->getConstants();
    }
}

Class Profile 
{
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";

    use ConstantExport;

}

উদাহরণ ব্যবহার করুন

// So simple and so clean
$constList = Profile::getConstants(); 

print_r($constList); // TEST

আউটপুট:

Array
(
    [LABEL_FIRST_NAME] => First Name
    [LABEL_LAST_NAME] => Last Name
    [LABEL_COMPANY_NAME] => Company
)


4

শ্রেণীর অভ্যন্তরে নিজস্ব ধ্রুবক ফিরিয়ে দেওয়ার জন্য কোনও পদ্ধতি থাকা সহজ y
আপনি এইভাবে করতে পারেন:

class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";


    public static function getAllConsts() {
        return (new ReflectionClass(get_class()))->getConstants();
    }
}

// test
print_r(Profile::getAllConsts());

3

এগুলি শুরু করার সাথে অ্যারে হিসাবে কেন তাদের শ্রেণি ভেরিয়েবলে রাখবেন না? লুপের মাধ্যমে আরও সহজ করে তোলে।

private $_data = array("production"=>0 ...);

2
কারণ অ্যারেগুলি ধ্রুবক নয়? যদি আপনি এমন কোনও বাস্তবায়ন করেন যা ভেরিয়েবল হিসাবে ধ্রুবক হিসাবে মনে করা হয় তবে আপনি অজান্তেই এটি পরিবর্তন বা আনসেট না হওয়ার ঝুঁকিপূর্ণ। অন্য কথায় আপনি ধ্রুবক তাদের উপর নির্ভর করতে পারবেন না।
গর্ডনএম

3

শেষ পর্যন্ত নেমস্পেস সহ:

namespaces enums;
class enumCountries 
{
  const CountryAustria          = 1 ;
  const CountrySweden           = 24;
  const CountryUnitedKingdom    = 25;
}

namespace Helpers;
class Helpers
{
  static function getCountries()
  {
    $c = new \ReflectionClass('\enums\enumCountries');
    return $c->getConstants();
  }
}

print_r(\Helpers\Helpers::getCountries());

1
class Qwerty 
{
    const __COOKIE_LANG_NAME__ = "zxc";
    const __UPDATE_COOKIE__ = 30000;

    // [1]
    public function getConstants_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    }    

    // [2]
    static function getConstantsStatic_(){

        return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__, 
                '__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__]; 
    } 
}

// [1]
$objC = new Qwerty();
var_dump($objC->getConstants_());

// [2]
var_dump(Qwerty::getConstantsStatic_());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.