পিএইচপি-তে :: (ডাবল কোলন) এবং -> (তীর) এর মধ্যে পার্থক্য কী?


197

পিএইচপি-তে পদ্ধতি অ্যাক্সেসের দুটি স্বতন্ত্র উপায় রয়েছে তবে পার্থক্য কী?

$response->setParameter('foo', 'bar');

এবং

sfConfig::set('foo', 'bar');

আমি ধরে নিচ্ছি ->(ভেরিয়েবলের জন্য ফাংশনের জন্য সাইন বা শেভ্রনের চেয়ে বেশি ড্যাশ) ব্যবহৃত হয়, এবং ::(ডাবল কলোন) ক্লাসগুলির জন্য ফাংশনের জন্য ব্যবহৃত হয়। সঠিক?

হয় =>নিয়োগ অপারেটর শুধুমাত্র একটি অ্যারের মধ্যে বরাদ্দ ডাটা করতেন? এটি কি =অসমেন্ট অপারেটরের বিপরীতে যা কোনও ভেরিয়েবল ইনস্ট্যান্টেট বা সংশোধন করতে ব্যবহৃত হয়?



উত্তর:


173

বাম অংশটি যখন কোনও অবজেক্ট উদাহরণস্বরূপ থাকে তখন আপনি ব্যবহার করেন ->। অন্যথায়, আপনি ব্যবহার ::

এর অর্থ এটি ->বেশিরভাগ ক্ষেত্রে অ্যান্সেস সদস্যদের অ্যাক্সেস করতে ব্যবহৃত হয় (যদিও এটি স্ট্যাটিক সদস্যদের অ্যাক্সেসের জন্যও ব্যবহার করা যেতে পারে, যেমন ব্যবহার নিরুৎসাহিত করা হয়), ::সাধারণত স্থির সদস্যদের অ্যাক্সেস করতে ব্যবহৃত হয় (যদিও কয়েকটি বিশেষ ক্ষেত্রে এটি উদাহরণস্বরূপ সদস্যদের অ্যাক্সেস করতে ব্যবহৃত হয়) )।

সাধারণভাবে, ::জন্য ব্যবহার করা হয় সুযোগ রেজল্যুশন , এবং এটি থাকতে পারে পারেন একটি বর্গ নাম, parent, self, অথবা (পিএইচপি 5.3 মধ্যে) staticতার বাম দিকে। parentশ্রেণীর এটি ব্যবহৃত হয় যেখানে সুপারক্লাসের সুযোগকে বোঝায়; selfশ্রেণীর যেখানে এটি ব্যবহৃত হয়েছে তার ক্ষেত্রকে বোঝায়; static"স্কোপ" বলে উল্লেখ করে ( দেরিতে স্থির বাইন্ডিংগুলি দেখুন )।

নিয়মটি হল যে সহ একটি কল ::একটি উদাহরণ কল যদি এবং কেবল যদি:

  • লক্ষ্য পদ্ধতি স্থির হিসাবে ঘোষণা করা হয় না এবং
  • কল করার সময় একটি সামঞ্জস্যপূর্ণ অবজেক্ট প্রসঙ্গ রয়েছে, যার অর্থ এগুলি অবশ্যই সত্য হতে পারে:
    1. কলটি এমন একটি প্রসঙ্গ থেকে করা হয়েছে যেখানে $thisউপস্থিত রয়েছে এবং
    2. এর শ্রেণিটি $thisহয় হয় পদ্ধতির শ্রেণি বলা হয় বা এটির একটি সাবক্লাস।

উদাহরণ:

class A {
    public function func_instance() {
        echo "in ", __METHOD__, "\n";
    }
    public function callDynamic() {
        echo "in ", __METHOD__, "\n";
        B::dyn();
    }

}

class B extends A {
    public static $prop_static = 'B::$prop_static value';
    public $prop_instance = 'B::$prop_instance value';

    public function func_instance() {
        echo "in ", __METHOD__, "\n";
        /* this is one exception where :: is required to access an
         * instance member.
         * The super implementation of func_instance is being
         * accessed here */
        parent::func_instance();
        A::func_instance(); //same as the statement above
    }

    public static function func_static() {
        echo "in ", __METHOD__, "\n";
    }

    public function __call($name, $arguments) {
        echo "in dynamic $name (__call)", "\n";
    }

    public static function __callStatic($name, $arguments) {
        echo "in dynamic $name (__callStatic)", "\n";
    }

}

echo 'B::$prop_static: ', B::$prop_static, "\n";
echo 'B::func_static(): ', B::func_static(), "\n";
$a = new A;
$b = new B;
echo '$b->prop_instance: ', $b->prop_instance, "\n";
//not recommended (static method called as instance method):
echo '$b->func_static(): ', $b->func_static(), "\n";

echo '$b->func_instance():', "\n", $b->func_instance(), "\n";

/* This is more tricky
 * in the first case, a static call is made because $this is an
 * instance of A, so B::dyn() is a method of an incompatible class
 */
echo '$a->dyn():', "\n", $a->callDynamic(), "\n";
/* in this case, an instance call is made because $this is an
 * instance of B (despite the fact we are in a method of A), so
 * B::dyn() is a method of a compatible class (namely, it's the
 * same class as the object's)
 */
echo '$b->dyn():', "\n", $b->callDynamic(), "\n";

আউটপুট:

বি ::। প্রপ_স্ট্যাটিক: বি ::। প্রপ_স্ট্যাটিক মান
বি :: ফানক_স্ট্যাটিক (): বি :: ফানক_স্ট্যাটিক

$ b-> প্রোপ_ইনস্ট্যান্স: বি :: $ প্রোপ_ইনস্ট্যান্স মান
$ বি-> ফানক_স্ট্যাটিক (): বি :: ফানক_স্ট্যাটিক

$ B-> func_instance ():
in B :: func_instance
এ এ :: ফানক ইনস্ট্যান্স
এ এ :: ফানক ইনস্ট্যান্স

$ A-> Dyn ():
এ :: কল-ডায়নামিক
গতিশীল গতিতে (__callStatic)

$ B-> Dyn ():
এ :: কল-ডায়নামিক
গতিশীল গতিতে (__call)

3
" ->বেশিরভাগ ক্ষেত্রে উদাহরণ সদস্যদের অ্যাক্সেস করতে ব্যবহৃত হয় (যদিও এটি স্ট্যাটিক সদস্যদের অ্যাক্সেসের জন্যও ব্যবহার করা যেতে পারে, যেমন ব্যবহার নিরুৎসাহিত করা হয়)" আমি জানতাম না এটি হতে পারে it সুতরাং যদি স্থির সদস্যদের অ্যাক্সেস করার জন্য এটি কোনও উপায়ে "ফাংশন" হয় - যদি কেউ এটির মতো ভুলভাবে ব্যবহার করে তবে আচরণে কী পার্থক্য আশা করা যায়? শুধু আউট কৌতুহল.
lucideer

4
@ লুসিডিয়ার স্ট্যাটিক পদ্ধতির ক্ষেত্রে এটি একটি ভাল অনুশীলনের প্রশ্ন (পদ্ধতিটি ক্লাসের নিজস্ব) তবে পিএইচপি কোনও স্থির পদ্ধতিতে কল করলে পিএইচপি অভিযোগ করে না ->। অবশ্যই, আপনার ক্লাসটি কেবল একটি স্ট্যাটিক পদ্ধতিতে কল করতে ইনস্ট্যান্টিয়েট করতে হতে পারে, সুতরাং একটি পারফরম্যান্স হিটও রয়েছে। বৈশিষ্ট্যগুলির সাথে, তবে আরও সমস্যা রয়েছে। একটি কঠোর সতর্কতা উত্থাপিত হয় এবং এটি কাজ করে বা নাও পারে । মনে রাখবেন যে বিপরীতটিও সত্য - আপনি কোনও উদাহরণ পদ্ধতিটিকে স্ট্যাটিকভাবে কল করতে পারেন তবে এটি আরও খারাপ (এবং আপনি $thisএই পদ্ধতি প্রয়োগের ক্ষেত্রে ব্যবহার করতে পারবেন না )।
আর্টেফ্যাক্টো

52

::স্থির প্রসঙ্গে ব্যবহৃত হয় , অর্থাত্‍। যখন কোনও পদ্ধতি বা সম্পত্তি স্থির হিসাবে ঘোষণা করা হয়:

class Math {
    public static function sin($angle) {
        return ...;
    }
}

$result = Math::sin(123);

এছাড়াও, আপনি যখন কোনও পিতৃ শ্রেণীর কোনও পদ্ধতি / সম্পত্তি আহবান করেন তখন ::অপারেটর (স্কোপ রেজোলিউশন অপারেটর, ওরফে পামাইম নেকুডোটাইম ) গতিশীল প্রসঙ্গে ব্যবহৃত হয়:

class Rectangle {
     protected $x, $y;

     public function __construct($x, $y) {
         $this->x = $x;
         $this->y = $y;
     }
}

class Square extends Rectangle {
    public function __construct($x) {
        parent::__construct($x, $x);
    }
}

->গতিশীল প্রসঙ্গে যেমন ব্যবহৃত হয় ie আপনি যখন কিছু শ্রেণীর উদাহরণ দিয়ে কাজ করেন:

class Hello {
    public function say() {
       echo 'hello!';
    }
}

$h = new Hello();
$h->say();

যাইহোক: আমি মনে করি না যে যখন আপনার কোনও ওওপি অভিজ্ঞতা না থাকে তখন সিমফোনি ব্যবহার করা ভাল ধারণা।


24

প্রকৃতপক্ষে এই প্রতীকটির সাহায্যে আমরা একটি শ্রেণি পদ্ধতি কল করতে পারি যা স্থিতিশীল এবং অন্যান্য আরম্ভের উপর নির্ভর করে না ...

class Test {

    public $name;

    public function __construct() {
        $this->name = 'Mrinmoy Ghoshal';
    }

    public static function doWrite($name) {
        print 'Hello '.$name;
    }

    public function write() {
        print $this->name;
    }
}

এখানে doWrite()ফাংশনটি অন্য কোনও পদ্ধতি বা ভেরিয়েবলের উপর নির্ভরশীল নয় এবং এটি একটি স্ট্যাটিক পদ্ধতি। এই কারণেই আমরা এই শ্রেণীর অবজেক্টটি আরম্ভ না করেই এই অপারেটর দ্বারা এই পদ্ধতিটি কল করতে পারি।

Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.

তবে আপনি যদি writeপদ্ধতিটিকে এইভাবে কল করতে চান তবে এটি ত্রুটি উত্পন্ন করবে কারণ এটি আদ্যক্ষর নির্ভর।


16

=>অপারেটর একটি মিশুক অ্যারের মধ্যে বরাদ্দ কী-মান জোড়া ব্যবহার করা হয়। উদাহরণ স্বরূপ:

$fruits = array(
  'Apple'  => 'Red',
  'Banana' => 'Yellow'
);

foreachবিবৃতিতে এর অর্থ একই :

foreach ($fruits as $fruit => $color)
  echo "$fruit is $color in color.";

14

স্থির এবং তাত্ক্ষণিক পদ্ধতি এবং বৈশিষ্ট্যগুলির মধ্যে পার্থক্যটি কেবল পিএইচপি 5-এ ওওপি পিএইচপি দিয়ে শুরু করা তাদের অন্যতম বড় বাধা বলে মনে হচ্ছে।

স্থিতিশীল প্রসঙ্গ থেকে কোনও বস্তু বা সম্পত্তি কল করার সময় ডাবল কোলন অপারেটর (যাকে হিব্রু - ট্রিভিয়া থেকে পামাইম নেকুডোটাইম বলা হয়) ব্যবহৃত হয় । এর অর্থ এটি অবজেক্টের একটি উদাহরণ এখনও তৈরি হয়নি।

তীর অপারেটর, বিপরীতে, পদ্ধতি বা বৈশিষ্ট্যগুলিকে কল করে যা বস্তুর উদাহরণের উল্লেখ হিসাবে reference

স্ট্যাটিক পদ্ধতিগুলি বিশেষত অবজেক্ট মডেলগুলিতে কার্যকর হতে পারে যা পদ্ধতিগুলি তৈরি এবং মুছতে কোনও ডাটাবেসের সাথে সংযুক্ত থাকে, যেহেতু আপনি সন্নিবেশ টেবিল আইডিতে রিটার্ন মানটি সেট করতে পারেন এবং তারপরে সারণি আইডি দ্বারা অবজেক্টটি ইনস্ট্যান্ট করতে কনস্ট্রাক্টর ব্যবহার করতে পারেন।


2

হ্যাঁ, আমি শুধু আমার প্রথম আঘাত 'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'। আমার খারাপ, আমার এমনটি $instance::method()হওয়া উচিত ছিল $instance->method()। বোকা আমাকে।

অদ্ভুত বিষয়টি এটি এখনও আমার স্থানীয় মেশিনে ঠিক কাজ করে (পিএইচপি 5.3.8 চলছে) - কিছুই নয়, এমনকি ত্রুটি_সামগ্রী = E_ALL সহ একটি সতর্কতাও নয় - তবে পরীক্ষার সার্ভারে মোটেই নয়, সেখানে এটি কেবল একটি বাক্য গঠন ত্রুটির সাথে বিস্ফোরিত হয় এবং ব্রাউজারে একটি সাদা পর্দা। যেহেতু টেস্ট মেশিনে পিএইচপি লগিং বন্ধ ছিল, এবং হোস্টিং সংস্থা এটি চালু করতে খুব ব্যস্ত ছিল, তাই এটি খুব স্পষ্টও ছিল না।

সুতরাং, সতর্কতার শব্দ: স্পষ্টতই, কিছু পিএইচপি ইনস্টলেশন আপনাকে $ উদাহরণ :: পদ্ধতি () ব্যবহার করতে দেবে, অন্যরা তা না করে।

কেউ যদি কেন এটি প্রসারিত করতে পারে তবে দয়া করে করুন।

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