পিএইচপি স্থির ফাংশন


108

আমার পিএইচপি-তে স্থির ফাংশন সম্পর্কিত একটি প্রশ্ন রয়েছে।

ধরা যাক আমার একটা ক্লাস আছে

class test {
    public function sayHi() {
        echo 'hi';
    }
}

আমি যদি test::sayHi();এটি করি তবে কোনও সমস্যা ছাড়াই কাজ করে।

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); পাশাপাশি কাজ করে।

প্রথম শ্রেণি এবং দ্বিতীয় শ্রেণির মধ্যে পার্থক্য কী?

স্ট্যাটিক ফাংশন সম্পর্কে বিশেষ কী?


15
পিএইচপি 7 হিসাবে আপনি স্থিতিশীলভাবে অ স্থিত পদ্ধতি কল করতে পারবেন না
সানজয় যাদব

উত্তর:


153

প্রথম শ্রেণিতে sayHi()আসলে এমন একটি উদাহরণ পদ্ধতি যা আপনি স্ট্যাটিক পদ্ধতি হিসাবে কল করছেন এবং আপনি এটির সাথে দূরে চলে যান কারণ sayHi()কখনই উল্লেখ করা হয় না $this

স্ট্যাটিক ফাংশন ক্লাসের সাথে সম্পর্কিত, ক্লাসের উদাহরণ নয়। যেমন, $thisএকটি স্থির প্রসঙ্গ থেকে উপলব্ধ না ( $thisকোনও বস্তুর দিকে নির্দেশ করছে না)।


22
এখন অ স্থির পদ্ধতিগুলির স্ট্যাটিক কলিং কাজ করে তবে হ্রাস করা হয়। উদাহরণস্বরূপ পদ্ধতিগুলির জন্য এই সিনট্যাক্সটি ব্যবহারে সতর্ক থাকুন!
জেট

1
সুতরাং তারা কেন এটি স্থির ফাংশন হিসাবে বলে? কারণ ডায়নামিক ডেটা প্রবাহ এবং গতিশীল আউটপুট সহ একাধিক উদাহরণ নেই। কেবল আমাকে গাইড করুন @ @ বিশৃঙ্খলা
সূর্য

22

সোজাভাবে, স্থির ফাংশনগুলি যেখানে শ্রেণিভুক্ত সেগুলি স্বাধীনভাবে কাজ করে।

$ এর অর্থ, এটি এই শ্রেণীর একটি বিষয়। এটি স্থির ফাংশনগুলির জন্য প্রযোজ্য নয়।

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9
ঠিক আছে আমি পিএইচপি উইজার্ড নই, তবে স্থির ফাংশনে যে ভেরিয়েবল ('হ্যালো') প্রেরণ করা হয়, তা কি স্পষ্টতই 'হাই' দিয়ে ওভাররাইট করা হচ্ছে? মানে লাইন প্রিন্ট টেস্ট 1 :: sayHi ('হ্যালো'); 'হ্যালো' ফিরবে না, তবে 'হাই' ফিরবে?
Fnord23

6
এই উত্তরটি পঙ্কিল আছে (স্ট্যাটিক ফাংশন প্রভাব পারেন এবং উদাহরণ বিন্দু খুব পরিষ্কার না কোন শ্রেণী তারা রয়েছেন উপর নির্ভর করে)।
রিনিয়ারপোস্ট

খুব ভাল উদাহরণ নয়। $ হাই = 'হাই'; প্রদত্ত যুক্তিটি ওভাররাইট করে এবং স্থির ঘোষণার সাথে কিছুই করার থাকে না। আমি এটিকে ঠিক করব: স্ব :: $ হাই = $ হাই; এবং এটি অ-স্থিতাবস্থার মতোই কাজ করবে। আপনি নিজের সাথে ক্লাস ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন :: এর পরিবর্তে $
এটি-

20

পুরো পার্থক্য হ'ল, আপনি $thisস্থির ফাংশনের ভিতরে সরবরাহ করবেন না । আপনি যদি ব্যবহার করার চেষ্টা করেন তবে $thisআপনি একটি পাবেন Fatal error: Using $this when not in object context

ভাল, ঠিক আছে, অন্য একটি পার্থক্য: E_STRICTআপনার প্রথম উদাহরণ দ্বারা একটি সতর্কতা উত্পন্ন হয়।


1
আমি যখন প্রথম ব্যবহার করি তখন আমার কোনও সতর্কতা নেই এবং আমি পিএইচপি 7
আশঙ্কান নাসিরজাদে

স্ট্যাটিক ফাংশনের ভিতরে আমাদের কেন নেই? এর স্থাপত্য যুক্তি কী? ধন্যবাদ।
লুকাস বুস্তামন্তে

@ লুকাসবুস্তামেন্টে: $thisবর্তমান অবজেক্টটিকে বোঝায়। একটি স্থির ফাংশনে, কোনও বর্তমান অবজেক্ট নেই; ফাংশন ক্লাসে প্রয়োজন নেই বা সেই শ্রেণীর কোনও অবজেক্টের রেফারেন্স ছাড়াই ক্লাসে রয়েছে।
বিশৃঙ্খলা

3

স্থির নন-স্ট্যাটিক পদ্ধতিতে কল করা স্থিতিশীলভাবে একটি E_STRICT স্তর সতর্কতা উত্পন্ন করে।


2

সংক্ষেপে, দ্বিতীয় ক্ষেত্রে আপনার অবজেক্টটি নেই, কারণ স্থির পদ্ধতিটি শ্রেণীর একটি ক্রিয়া / পদ্ধতি যা অবজেক্টের উদাহরণ নয়।


1
ক্লাস ফাংশনকে আপনি কীভাবে সংজ্ঞায়িত করেন তা স্থির হয়? অন্য কোন অভিনব ব্যবসা? সুতরাং আপনি বলছেন যদি এটি "স্ট্যাটিক" না বলে "শ্রেণি_মোথার" বলা হত, তবে এটি আরও শব্দার্থক হবে?
আহ্নবিজক্যাড

1

উদাহরণগুলির চেষ্টা করার পরে (পিএইচপি 5.3.5), আমি দেখতে পেয়েছি যে ফাংশন সংজ্ঞায়িত করার ক্ষেত্রে উভয় ক্ষেত্রে আপনি $thisশ্রেণি ফাংশনে কাজ করতে অপারেটর ব্যবহার করতে পারবেন না । সুতরাং আমি তাদের মধ্যে কোনও পার্থক্য খুঁজে পাইনি। :(

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