পিএইচপি - একটি শ্রেণীর ভিতরে ধ্রুবক সংজ্ঞায়িত


88

আমি কোনও শ্রেণীর অভ্যন্তরে একটি ধ্রুবককে কীভাবে সংজ্ঞায়িত করতে পারি এবং এটি এত সহজে দৃশ্যমান করতে পারি যখন শ্রেণি প্রসঙ্গে বলা হয়?

....কিছুটা এইরকম Foo::app()->MYCONSTANT;

(এবং যদি MYCONSTANTউপেক্ষা করা পছন্দ হয়)


4
আমার সম্প্রতি এই সমস্যাটি ছিল stackoverflow.com/q/5710676/560299
আইবু

উত্তর:


141

ক্লাস কনস্ট্যান্ট দেখুন :

class MyClass
{
    const MYCONSTANT = 'constant value';

    function showConstant() {
        echo  self::MYCONSTANT. "\n";
    }
}

echo MyClass::MYCONSTANT. "\n";

$classname = "MyClass";
echo $classname::MYCONSTANT. "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::MYCONSTANT."\n"; // As of PHP 5.3.0

এই ক্ষেত্রে অনুনাদী সালে MYCONSTANTনিজে একটি অনির্ধারিত ধ্রুবক এবং আউটপুট সম্পর্কে একটি বিজ্ঞপ্তি বাড়াতে হবে ধ্রুবক নাম একটি স্ট্রিং রূপান্তর: "MYCONSTANT"


সম্পাদনা - সম্ভবত আপনি যা খুঁজছেন তা এই স্থির বৈশিষ্ট্য / ভেরিয়েবল :

class MyClass
{
    private static $staticVariable = null;

    public static function showStaticVariable($value = null)
    {
        if ((is_null(self::$staticVariable) === true) && (isset($value) === true))
        {
            self::$staticVariable = $value;
        }

        return self::$staticVariable;
    }
}

MyClass::showStaticVariable(); // null
MyClass::showStaticVariable('constant value'); // "constant value"
MyClass::showStaticVariable('other constant value?'); // "constant value"
MyClass::showStaticVariable(); // "constant value"

তবে শ্রেণীর কোনও ক্রিয়াকলাপের মধ্যে এটি সংজ্ঞায়িত করার জন্য এটি কাজ করে না :(
অ্যালেক্স

@ অ্যালেক্স: না এটি হয় না (আফাইক, কিছুটা অস্পষ্ট উপায় থাকতে পারে)।
অ্যালিক্স অ্যাক্সেল

4
(is_null(self::$staticVariable) === true) && (isset($value) === true)হিসাবে অনেক বেশি সংহত হবে self::$staticVariable === null && $value !== null$valueসর্বদা ফাংশনের অভ্যন্তরে সেট করা হবে , তাই ব্যবহার করার দরকার নেই isset। এবং হাইপার-স্পষ্ট === trueকিছু কিছুই যোগ করে না।
ছদ্মবেশ

4
আমরা এই কথোপকথন আগে ছিল? এটি সাহায্য করতে পারে না, আমি সত্যিই style স্টাইলটি অপছন্দ করি। ;
ডি

@ নির্ধারণ: হ্যাঁ আমি এই স্টাইলে খুব অভ্যস্ত এবং এটি আমার পক্ষে কাজ করে তাই আমি এটির সাথে লেগে থাকব, তবে আপনি ঠিকই আছেন। =)
অ্যালিক্স অ্যাক্সেল

24

এটি এবং পুরানো প্রশ্ন, তবে এখন পিএইচপি 7.1 এ আপনি ধ্রুবকটির দৃশ্যমানতা সংজ্ঞায়িত করতে পারেন।

উদাহরণ

<?php
class Foo {
    // As of PHP 7.1.0
    public const BAR = 'bar';
    private const BAZ = 'baz';
}
echo Foo::BAR . PHP_EOL;
echo Foo::BAZ . PHP_EOL;
?>

পিএইচপি 7.1 উপরের উদাহরণটির আউটপুট:

বার

মারাত্মক ত্রুটি: অবহিত ত্রুটি: ব্যক্তিগত কনস্ট্রেট ফু :: BAZ এ অ্যাক্সেস করা যায় না ...

দ্রষ্টব্য: পিএইচপি 7.1.0 অনুসারে শ্রেণিবদ্ধদের জন্য ভিজিবিলিটি সংশোধক অনুমোদিত allowed

আরও তথ্য এখানে


11
class Foo {
    const BAR = 'baz';
}

echo Foo::BAR;

এটি ক্লাসের ধ্রুবক তৈরির একমাত্র উপায় । এই ধ্রুবকগুলির মাধ্যমে সর্বদা বিশ্বব্যাপী অ্যাক্সেসযোগ্য Foo::BARতবে এগুলি কেবলমাত্র অ্যাক্সেসযোগ্য নয় BAR

এর মতো একটি সিনট্যাক্স অর্জন করতে Foo::baz()->BAR, আপনার baz()শ্রেণীর ফাংশন থেকে Fooকোনও সম্পত্তি রয়েছে এমন কোনও জিনিস ফেরত দিতে হবে BAR। যদিও এটি একটি ধ্রুবক নয়। আপনার নির্ধারিত যে ধ্রুবক সর্বদা বিশ্বব্যাপী যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য এবং ফাংশন কল ফলাফলগুলিতে সীমাবদ্ধ করা যায় না।


6

এটি বেশ পুরানো প্রশ্ন, তবে সম্ভবত এই উত্তরটি এখনও অন্য কাউকে সহায়তা করতে পারে।

প্রাক-সংজ্ঞায়িত মানটি প্রদান করে এমন একটি পদ্ধতিতে চূড়ান্ত কীওয়ার্ড প্রয়োগ করে আপনি শ্রেণীর ক্ষেত্রের মধ্যে সীমাবদ্ধ এমন একটি সার্বজনীন ধ্রুবক অনুকরণ করতে পারেন:

class Foo {

    // This is a private constant
    final public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

কোনও পদ্ধতির চূড়ান্ত কীওয়ার্ডটি একটি প্রসারিত শ্রেণিকে পদ্ধতিটিকে পুনরায় সংজ্ঞায়িত করতে বাধা দেয়। আপনি ক্লাস ঘোষণার সামনেও চূড়ান্ত কীওয়ার্ডটি রাখতে পারেন, সেক্ষেত্রে কীওয়ার্ডটি শ্রেণি উত্তরাধিকারকে বাধা দেয়।

অ্যালেক্স নীচের কোডটি সন্ধান করছিল ঠিক কীভাবে তা পেতে ব্যবহার করা যেতে পারে:

final class Constants {

    public MYCONSTANT()
    {
        return 'MYCONSTANT_VALUE';
    }
}

class Foo {

    static public app()
    {
        return new Constants();
    }
}

এমুলেটেড ধ্রুবক মানটি এর মতো অ্যাক্সেসযোগ্য হবে:

Foo::app()->MYCONSTANT();

3

আপনি পিএইচপি তে একটি শ্রেণির ধ্রুবক সংজ্ঞায়িত করতে পারেন। তবে আপনার ক্লাস ধ্রুবকটি কোনও বস্তুর উদাহরণ থেকেও অ্যাক্সেসযোগ্য হবে। এটি পিএইচপি এর কার্যকারিতা। যাইহোক, পিএইচপি 7.1 হিসাবে , আপনি অ্যাক্সেস মডিফায়ারগুলি ( public, privateবা protected) দিয়ে আপনার শ্রেণি ধ্রুবককে সংজ্ঞায়িত করতে পারেন ।

একটি কাজ প্রায় হিসাবে আপনার ধ্রুবক সংজ্ঞায়িত করতে হবে privateবা protectedএবং তারপর তাদের একটি মাধ্যমে পাঠযোগ্য static function। স্থির প্রসঙ্গ থেকে যদি ডাকা হয় তবে এই ফাংশনটি কেবল ধ্রুবক মানগুলি ফিরিয়ে আনতে হবে।

আপনি আপনার প্যারেন্ট ক্লাসে এই স্থিতিকর কাজটিও তৈরি করতে পারেন এবং এটি ডিফল্ট কার্যকারিতা তৈরি করতে অন্য সমস্ত শ্রেণিতে কেবল এই প্যারেন্ট ক্লাসের উত্তরাধিকারী হতে পারেন।

ক্রেডিট: http://dwellupper.io/post/48/defining-class-constants-in-php

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