পিএইচপি মধ্যে :: ক্লাস কি?


102

::classপিএইচপি মধ্যে স্বরলিপি কি ?

সিনট্যাক্সের প্রকৃতির কারণে একটি দ্রুত গুগল অনুসন্ধান কিছুই দেয় না।

কোলন কোলন বর্গ

এই স্বরলিপি ব্যবহার করে সুবিধা কি?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];

উত্তর:


87

এই বৈশিষ্ট্যটি পিএইচপি 5.5 তে প্রয়োগ করা হয়েছিল।

ডকুমেন্টেশন: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

এটি 2 কারণে খুব কার্যকর।

  • আপনার ক্লাসের নামগুলি আর স্ট্রিংয়ে সংরক্ষণ করতে হবে না। সুতরাং, আপনি যখন নিজের কোডটি রিফ্যাক্ট করেন তখন অনেক IDEs এই শ্রেণীর নামগুলি পুনরুদ্ধার করতে পারে
  • আপনি useআপনার ক্লাসটি সমাধান করার জন্য কীওয়ার্ডটি ব্যবহার করতে পারেন এবং আপনাকে পুরো শ্রেণীর নাম লেখার দরকার নেই।

উদাহরণ স্বরূপ :

use \App\Console\Commands\Inspire;

//...

protected $commands = [
    Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];

আপডেট :

এই বৈশিষ্ট্যটি লেট স্ট্যাটিক বাইন্ডিংয়ের জন্যও কার্যকর ।

__CLASS__যাদু ধ্রুবকটি ব্যবহার না করে আপনি static::classবৈশিষ্ট্যটি পিতামাতার শ্রেণীর অভ্যন্তরে উত্পন্ন ক্লাসের নাম পেতে ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

class A {

    public function getClassName(){
        return __CLASS__;
    }

    public function getRealClassName() {
        return static::class;
    }
}

class B extends A {}

$a = new A;
$b = new B;

echo $a->getClassName();      // A
echo $a->getRealClassName();  // A
echo $b->getClassName();      // A
echo $b->getRealClassName();  // B

1
সামান্য সংশোধন: প্রথম উদাহরণটিতে Inspire::classপশ্চাদপদ স্ল্যাশ উপসর্গ ব্যতীত "অ্যাপ \ কনসোল, কমান্ডস backward অনুপ্রেরণা" সমান।
জেসন

1
@ ফাবিয়েনহাদাদি: নোট করুন যে দুটি স্বরলিপি অনুমোদিত use \App\...এবং use App\...অনুমোদিত। আমি এটি একটি সাবনেমস্পেসে অন্তর্ভুক্ত একটি ক্লাস এবং বর্তমান নেমস্পেসের শ্রেণিবদ্ধের বাইরে থাকা একটি শ্রেণীর মধ্যে পার্থক্য তৈরি করতে ব্যবহার করি।
আলফায়াক্স

সতর্কতার শব্দ, আপনি যে কোনও কিছু টাইপ করতে পারেন এবং এখনও একটি "শ্রেণি" নাম পেতে পারেন। আমি SomeDumbCrapThatDoesntExist :: ক্লাস টাইপ করতে পারলাম এবং IDE এটি ধরতে না পারলে এটি আমাকে ত্রুটি বা সতর্কতা দেবে না। একটি টাইপ করা সহজ এবং এটি মিস করুন।
গ্যাব্রিয়েল আলাক

19

class সম্পূর্ণ বিশেষ শ্রেণীর নাম পেতে পিএইচপি দ্বারা সরবরাহ করা হয়, যা বিশেষ।

Http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name দেখুন ।

<?php

class foo {
    const test = 'foobar!';
}

echo foo::test; // print foobar!

লারাভেল এতে স্যুইচ করার সিদ্ধান্ত নিয়েছে এমন কোনও কারণ আছে কি?
ইয়াদ

7
এটি অনুপ্রেরণা শ্রেণিতে স্থির নয়। এটি পিএইচপি দ্বারা সরবরাহ করা একটি ধ্রুবক। সম্পূর্ণ যোগ্যতাসম্পন্ন শ্রেণীর নাম পাওয়ার এটি একটি দ্রুত উপায়। php.net/manual/en/…
jfadich

1
@ ইয়াদা আমি বিশ্বাস করি লারাভেলকে এটির পিছনে যুক্তি ব্যবহার করে বলেছি এটি আপনাকে টাইপ করার জন্য আরও একটি কম জায়গা দেয়। একই জিনিসটি পেতে আপনি স্ট্রিং '\ অ্যাপ \ কনসোল \ কমান্ডস \ অনুপ্রেরণা' বা অনুপ্রাণিত করুন: শ্রেণিটি ব্যবহার করতে পারেন তবে আপনার আইডিই ডিবাগ করা আরও সহজ করে দেওয়ার কারণে বাক্যটিতে সিনট্যাক্স / বানান ত্রুটিগুলি ধরে ফেলবে।
jfadich

1

আপনি যদি কৌতূহলী হন যে বিভাগে কোন বিভাগে ::classআসে, (এটি কোনও ভাষা নির্ধারণ করা হোক না কেন), এটি খুব সহজ। এটি একটি ধ্রুবক । পিএইচপি একে "স্পেশাল কনস্ট্যান্ট" বলে। এটি বিশেষ কারণ এটি পিএইচপি সরবরাহ করে।

https://www.php.net/manual/en/language.oop5.constants.php


0

নিম্নলিখিত ব্যবহার করতে সচেতন হন:

if ($whatever instanceof static::class) {...}

এটি একটি সিনট্যাক্স ত্রুটি নিক্ষেপ করবে:

unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'

তবে আপনি পরিবর্তে নিম্নলিখিতটি করতে পারেন:

if ($whatever instanceof static) {...}

অথবা

$class = static::class;
if ($whatever instanceof $class) {...}

গতিশীল নামকরণের জন্য এই হ্যাক, পিএইচপি 5. * থেকে মত কাজ করে$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
ভ্লাদিমির অধ্যায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.