পিএইচপি (সি # এর মতো) স্ট্যাটিক ক্লাস তৈরি করা কি সম্ভব?


139

আমি পিএইচপি-তে একটি স্ট্যাটিক ক্লাস তৈরি করতে চাই এবং এটি সি # তে যেমন আচরণ করি তেমন করে

  1. কনস্ট্রাক্টরটিকে স্বয়ংক্রিয়ভাবে ক্লাসে প্রথম কল করা হয়
  2. কোনও তাত্ক্ষণিক প্রয়োজন নেই

এই ধরণের কিছু ...

static class Hello {
    private static $greeting = 'Hello';

    private __construct() {
        $greeting .= ' There!';
    }

    public static greet(){
        echo $greeting;
    }
}

Hello::greet(); // Hello There!

স্থির শ্রেণীর মতো আচরণ করার কথা বলে আপনি সংক্ষেপে ব্যাখ্যা করতে পারবেন? এটি কি কোনও ইউটিলিটির বাস্তবায়ন?
xtofl

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

উত্তর:


200

আপনার পিএইচপিতে স্ট্যাটিক ক্লাস থাকতে পারে তবে তারা কনস্ট্রাক্টরকে স্বয়ংক্রিয়ভাবে কল করবেন না (যদি আপনি চেষ্টা করেন এবং কল করেন তবে self::__construct()একটি ত্রুটি পাবেন) get

সুতরাং আপনাকে একটি initialize()পদ্ধতি তৈরি করতে হবে এবং প্রতিটি পদ্ধতিতে এটি কল করতে হবে:

<?php

class Hello
{
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>

20
আমি বেশিরভাগ ক্ষেত্রে কেবল এক জায়গায় সমস্ত ফাংশন গুটিয়ে ফেলার জন্য এটি করি। আই ইউ ইউটিলিটি :: doSomethingUseful ();
smack0007

16
এর পরিবর্তে কোনও সর্বজনীন অনুষ্ঠান করা এবং শ্রেণীর ঘোষণার পরে একে কল Therefore you'd have to create an initialize() function and call it in each method:করা সহজ হবে easier initialize
chacham15

4
আমি জানি এটি বেশ পুরানো, তবে এখন আপনি যাদু __callStatic ব্যবহার করতে পারেন তাই আপনি যখন কোনও স্থিতিশীল পদ্ধতি বা যেকোন কিছু কল করেন __callStatic, প্রথমে এটি কল করবে , সেখানে আপনি এটি দেখতে পেয়েছিলেন কিনা তা আরম্ভ করা হয়েছিল এবং তারপরে self::$methodবা যা যা আপনি কল করছেন তা দেখতে পাবে । যদি এটি এখনও পদ্ধতিটিকে সরাসরি কল করে থাকে তবে ব্যক্তিগতভাবে সবকিছু পরিবর্তন করার চেষ্টা করুন এবং সেখানে দেখুন।
মাটিস্লৌরিটি

1
যদি দুটি থ্রেড একই সাথে অভিবাদন কল করে তবে কি হবে? যেহেতু কোনও সিঙ্ক্রোনাইজেশন নেই, আর একবারে আরম্ভ করা হবে না (যা এই ক্ষেত্রে ঠিক আছে, তবে অন্য অনেক ক্ষেত্রে তা হবে না)। অথবা পিএইচপি একক থ্রেডেড এবং নোডের মতো প্রাক-প্রাক-ক্রিয়াশীল?
জন লিটল

53

গ্রেগের উত্তর ছাড়াও, আমি কনস্ট্রাক্টরকে বেসরকারী সেট করার পরামর্শ দেব যাতে ক্লাসটি ইনস্ট্যান্ট করা অসম্ভব।

সুতরাং আমার নম্র মতে এটি গ্রেগের একের ভিত্তিতে আরও সম্পূর্ণ উদাহরণ:

<?php

class Hello
{
    /**
     * Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class.
     */
    private function __construct() {}
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>

1
এটি দুর্দান্ত উপায়, যদি আপনার সিনগেলটন নির্দিষ্ট কিছু বস্তুর জন্য পাবলিক কনস্ট্রাক্টরের প্রয়োজন হয় তবে যদি কনস্ট্রাক্ট ফাংশনটি প্রয়োগ করা যায় না।
এরিক হার্লিটজ

4
@ এরিক হার্লিটজ এই প্রশ্নটি সিলেটটনের বিষয়ে নয়, এটি স্ট্যাটিক ক্লাস সম্পর্কে। আপনি কেন একটি স্ট্যাটিক ক্লাস তৈরি করতে চান যা বংশানুক্রমিকভাবে বোঝানো ক্লাস থেকে উত্তরাধিকার সূত্রে আসে?
মার্ক অ্যামেরি

3
ক্লাসটিকে তাত্পর্যপূর্ণ হওয়া থেকে প্রতিরোধ করার সাথে সমানভাবে বিমূর্ত হিসাবে ঘোষণা করা এবং স্থির পদ্ধতিতে কলগুলি মঞ্জুরি দেওয়া।
বস্টনি

24

আপনার সেই "স্ট্যাটিক" -র মতো ক্লাস থাকতে পারে। তবে আমি মনে করি, সত্যিই গুরুত্বপূর্ণ কিছু অনুপস্থিত: পিএইচপি তে আপনার অ্যাপ-চক্র নেই, তাই আপনি আপনার পুরো অ্যাপ্লিকেশনটিতে আসল স্ট্যাটিক (বা সিঙ্গলটন) পাবেন না ...

পিএইচপি-তে সিঙ্গলটন দেখুন


1
স্ট্যাটিক ক্লাস এবং সিলেটলেটগুলি কেবল 2 ভিন্ন জিনিস।
ম্যাক্স কটিনস

4
final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}

বি এর স্টাকচারকে সিনগন হ্যান্ডলার বলা হয় আপনি এটি এও করতে পারেন

Class a{
    static $instance;
    static function getA(...){
        if(!isset(self::$staticVar)){
            self::$staticVar = New A(...);
        }
        return self::$staticVar;
    }
}

এটি সিঙ্গলটন ব্যবহার $a = a::getA(...);


3

আমি সাধারণত নিয়মিত নন স্ট্যাটিক ক্লাস লিখতে পছন্দ করি এবং অবজেক্টের একক (সুডো স্ট্যাটিক) দৃষ্টান্ত ইনস্ট্যান্ট করতে কারখানা শ্রেণি ব্যবহার করি।

এই পদ্ধতিতে নির্মাতা এবং ডেস্ট্রাক্টর স্বাভাবিক হিসাবে কাজ করে এবং আমি চাইলে আমি অতিরিক্ত অ স্ট্যাটিক উদাহরণ তৈরি করতে পারি (উদাহরণস্বরূপ দ্বিতীয় ডিবি সংযোগ)

আমি এটি সর্বদা ব্যবহার করি এবং কাস্টম ডিবি স্টোর সেশন হ্যান্ডলারগুলি তৈরি করার জন্য বিশেষভাবে দরকারী, যখন পৃষ্ঠাটি ডেস্ট্রাক্টরকে সমাপ্ত করে সেশনটি ডাটাবেসে ঠেলে দেবে।

আর একটি সুবিধা হ'ল আপনি যে জিনিসগুলিকে কল করেছেন সেই আদেশটিকে উপেক্ষা করতে পারবেন কারণ চাহিদা অনুযায়ী সবকিছুই সেটআপ হয়ে যাবে।

class Factory {
    static function &getDB ($construct_params = null)
    {
        static $instance;
        if( ! is_object($instance) )
        {
            include_once("clsDB.php");
            $instance = new clsDB($construct_params);   // constructor will be called
        }
        return $instance;
    }
}

ডিবি ক্লাস ...

class clsDB {

    $regular_public_variables = "whatever";

    function __construct($construct_params) {...}
    function __destruct() {...}

    function getvar() { return $this->regular_public_variables; }
}

আপনি যে কোনও জায়গায় এটি ব্যবহার করতে চান কেবল কল করুন ...

$static_instance = &Factory::getDB($somekickoff);

তারপরে সমস্ত পদ্ধতিকে কেবল অ স্থির হিসাবে বিবেচনা করুন (কারণ তারা)

echo $static_instance->getvar();

1
এটি আসলে একটি সিঙ্গলটন প্যাটার্ন বাস্তবায়ন এবং সত্যই এটি ব্যবহার করা উচিত নয় - পরিবর্তে নির্ভরতা ইনজেকশনটি আটকে থাকুন, যা পরীক্ষামূলক এবং এটি ডিবাগ করা সহজ করে তোলে।
টমাস হ্যানসেন

1
আপনি কীভাবে এই উত্তরের জন্য নির্ভরতা ইনজেকশন ব্যবহার করবেন এবং কীভাবে এটি আরও পরীক্ষামূলক করে তোলে তার উদাহরণ দিতে পারেন?
সিজেসিমন

2

অবজেক্টটি স্থিরভাবে সংজ্ঞায়িত করা যায় না তবে এটি কাজ করে

final Class B{
  static $var;
  static function init(){
    self::$var = new A();
}
B::init();

1
আন্ড্রেস নিডেরমায়ার: পিএইচপি কীভাবে কাজ করে তা ঠিক করে দেয় (অ্যাপ্লিকেশন-চক্র = একটি একক অনুরোধ) তবে একটি সিঙ্গলটন (অনুরোধে বেঁচে থাকা একের উপরে) পিএইচপি-তে একটি পসিবিলিটি (পিএইচপি-তে একটি সিঙ্গলটন এমন একটি বস্তু যার 1 টি উদাহরণ রয়েছে (অ্যাপ্লিকেশনটিতে - চক্র)
বোরেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.