`স্ট্যাটিক` কীওয়ার্ডটির ভিতরে ফাংশন?


110

আমি ড্রুপাল 7 এর উত্সটি খুঁজছিলাম এবং আমি এমন কিছু জিনিস পেয়েছি যা আমি আগে দেখিনি। আমি পিএইচপি ম্যানুয়ালটিতে কিছু প্রাথমিকভাবে অনুসন্ধান করেছি, তবে এটি এই উদাহরণগুলির ব্যাখ্যা দেয় না।

কীওয়ার্ডটি staticকোনও ফাংশনের অভ্যন্তরে একটি ভেরিয়েবলের সাথে কী করে ?

function module_load_all($bootstrap = FALSE) {
    static $has_run = FALSE

উত্তর:


155

এটি ফাংশনটিকে $has_runএকাধিক কলের মধ্যে প্রদত্ত ভেরিয়েবলের ( আপনার উদাহরণে) মান মনে রাখে ।

আপনি এটি বিভিন্ন উদ্দেশ্যে ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}

এই উদাহরণে, ifশুধুমাত্র একবার কার্যকর করা হবে। এমনকি যদি একাধিক কল আসতে doStuffপারে।


4
এছাড়াও, যদি ফাংশনটি একবার চালানো $cacheহয় তবে nullএটি পরবর্তী কলগুলিতে মান পুনরায় সেট করবে না, তাই না ?
ব্যবহারকারী 151841

7
@ user151841 $cacheকেবলমাত্র অনুরোধগুলির মধ্যে পুনরায় সেট করা হবে। হ্যাঁ, এটি একই অনুরোধে (বা স্ক্রিপ্টের প্রয়োগ) লেটার কলগুলিতে পুনরায় সেট করা হবে না
যোশি

14
@ মুহাম্মাদ কারণ কীওয়ার্ডগুলি স্থির করে দেয়।
ইয়োশি

2
আমি বিশ্বাস করি যে ifকন্ডিশন চেকটি $cache === nullপ্রতিবার এই ফাংশনটি বলা $cache = '..'হবে তা কার্যকর করা হবে , ভেবেছি না ব্লকের কোড কার্যকর করা হবে কিনা thought
আইভারাস

যদি ফাংশনটি কোনও শ্রেণিতে একটি পদ্ধতি হয় তবে কি ঘটবে উদাহরণস্বরূপ স্থির পরিবর্তনশীল?
সান্টিয়াগো আরিজিটি

83

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

এই বিবেচনা:

class Foo
{
    public function call()
    {
        static $test = 0;

        $test++;
        echo $test . PHP_EOL; 
    }
}

$a = new Foo();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Foo();
$b->call(); // 4
$b->call(); // 5

আপনি যদি কেবল স্থিত শ্রেণীর উদাহরণের জন্য স্থিতিশীল ভেরিয়েবলের অবস্থাটি মনে রাখতে চান তবে আপনি আরও ভাল কোনও শ্রেণীর সম্পত্তিকে আটকে রাখতে চাই:

class Bar
{
    private $test = 0;

    public function call()
    {
        $this->test++;
        echo $this->test . PHP_EOL; 
    }
}


$a = new Bar();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Bar();
$b->call(); // 1
$b->call(); // 2

1
সেকি! এটি আমাকে একাধিকবার কামড় দিয়েছে। আমি প্রত্যাশা রেখেছিলাম যে স্ট্যাটিকটি কেবলমাত্র উদাহরণটিতে প্রয়োগ হবে, যা স্মৃতিচারণ করে; তবে এটি ছিল ভুল চিন্তাভাবনা, কারণ ক্লাসের প্রসঙ্গে "স্ট্যাটিক" মানে পুরো শ্রেণীর জন্য for বৈশিষ্ট্য, পদ্ধতি এবং ভেরিয়েবল।
systemovich

14

নিম্নলিখিত উদাহরণ দেওয়া:

function a($s){
    static $v = 10;
    echo $v;
    $v = $s;
}

প্রথম কল

a(20);

আউটপুট হবে 10, তারপর $vহতে হবে 20। ভেরিয়েবলটি $vফাংশন শেষ হওয়ার পরে সংগ্রহ করা আবর্জনা নয়, কারণ এটি একটি স্ট্যাটিক (অ-গতিশীল) পরিবর্তনশীল। স্ক্রিপ্ট সম্পূর্ণরূপে শেষ না হওয়া অবধি ভেরিয়েবল তার আওতায় থাকবে।

সুতরাং, নিম্নলিখিত কল

a(15);

তারপরে আউটপুট হবে 20এবং তারপরে সেট $vহবে 15


9

স্ট্যাটিক যেমন ক্লাসে হয় তেমনভাবে কাজ করে। ভেরিয়েবলটি কোনও ফাংশনের সমস্ত দৃষ্টান্তে ভাগ করা হয়। আপনার নির্দিষ্ট উদাহরণে, একবার ফাংশনটি চালানো হলে, _ has_run টি সত্যতে সেট করা থাকে। ফাংশনটির সমস্ত ভবিষ্যতের রানগুলিতে $ has_run = সত্য হবে। এটি রিকার্সিভ ফাংশনগুলিতে বিশেষভাবে কার্যকর (গণনা পাসের বিকল্প হিসাবে)।

একটি স্থিতিশীল ভেরিয়েবল কেবল স্থানীয় ফাংশন স্কোপে বিদ্যমান, তবে প্রোগ্রামের প্রয়োগের এই সুযোগটি ছাড়লে এটি এর মান হারাবে না।

Http://php.net/manual/en/language.variables.scope.php দেখুন


3

কোনও ফাংশনে স্ট্যাটিক ভেরিয়েবলের অর্থ হ'ল আপনি ফাংশনটিকে যতবার কল করুন না কেন, কেবলমাত্র 1 ভেরিয়েবল রয়েছে।

<?php

class Foo{
    protected static $test = 'Foo';
    function yourstatic(){
        static $test = 0;
        $test++;
        echo $test . "\n"; 
    }

    function bar(){
        $test = 0;
        $test++;
        echo $test . "\n";
    }
}

$f = new Foo();
$f->yourstatic(); // 1
$f->yourstatic(); // 2
$f->yourstatic(); // 3
$f->bar(); // 1
$f->bar(); // 1
$f->bar(); // 1

?>

3

ইয়াংয়ের উত্তরে প্রসারিত করা

আপনি যদি স্ট্যাটিক ভেরিয়েবল সহ কোনও শ্রেণি প্রসারিত করেন, স্বতন্ত্র বর্ধিত শ্রেণিগুলি উদাহরণগুলির মধ্যে ভাগ করে নেওয়া তাদের "নিজস্ব" রেফারেন্সড স্ট্যাটিককে ধরে রাখবে।

<?php
class base {
     function calc() {
        static $foo = 0;
        $foo++;
        return $foo;
     }
}

class one extends base {
    function e() {
        echo "one:".$this->calc().PHP_EOL;
    }
}
class two extends base {
    function p() {
        echo "two:".$this->calc().PHP_EOL;
    }
}
$x = new one();
$y = new two();
$x_repeat = new one();

$x->e();
$y->p();
$x->e();
$x_repeat->e();
$x->e();
$x_repeat->e();
$y->p();

আউটপুট:

এক: 1
দুই : 1
জন: 2
জন : 3 <- x_repeat
এক: 4
এক : 5 <- x_repeat
দুই : 2

http://ideone.com/W4W5Qv


1

কোনও ফাংশনের অভ্যন্তরে, এর staticঅর্থ হল যে পৃষ্ঠাটি লোড চলাকালীন প্রতিটি সময় ফাংশনটি ডাকা হলে ভেরিয়েবল তার মান ধরে রাখতে পারে।

অতএব আপনি যে উদাহরণটি দিয়েছেন তার মধ্যে, আপনি যদি কোনও ফাংশন দু'বার কল করে থাকেন, যদি এটি সেট $has_runকরা থাকে true, তবে ফাংশনটি জানতে পারবে যে এটি আগে বলা হয়েছিল কারণ দ্বিতীয়বার ফাংশনটি শুরু হওয়ার $has_runপরেও সমান হবে true

staticএই প্রসঙ্গে কীওয়ার্ডের ব্যবহারটি এখানে পিএইচপি ম্যানুয়ালটিতে ব্যাখ্যা করা হয়েছে: http://php.net/manual/en/language.variables.scope.php

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