আমি সচেতন যে instanceof
একটি অপারেটর এবং এটি is_a
একটি পদ্ধতি।
কর্মক্ষমতা পদ্ধতি কি ধীর? আপনি কি ব্যবহার করতে পছন্দ করবেন?
আমি সচেতন যে instanceof
একটি অপারেটর এবং এটি is_a
একটি পদ্ধতি।
কর্মক্ষমতা পদ্ধতি কি ধীর? আপনি কি ব্যবহার করতে পছন্দ করবেন?
উত্তর:
হালনাগাদ
পিএইচপি 5.3.9 হিসাবে কার্যকারিতা is_a()
পরিবর্তিত হয়েছে। নীচের মূল উত্তরটি জানিয়েছে যে is_a()
অবশ্যইObject
প্রথম আর্গুমেন্ট হিসাবে একটি গ্রহণ করতে হবে , তবে পিএইচপি সংস্করণ> = 5.3.9 এখন স্ট্রিং শ্রেণীর নামের তুলনা করার জন্য একটি $allow_string
to চ্ছিক তৃতীয় বুলিয়ান আর্গুমেন্টকে (ডিফল্ট false
) গ্রহণ করবে:
class MyBaseClass {}
class MyExtendingClass extends MyBaseClass {}
// Original behavior, evaluates to false.
is_a(MyExtendingClass::class, MyBaseClass::class);
// New behavior, evaluates to true.
is_a(MyExtendingClass::class, MyBaseClass::class, true);
মধ্যে নতুন আচরণের কী পার্থক্য instanceof
এবং is_a()
যে instanceof
, সবসময় চেক করবে যে লক্ষ্য নিদিষ্ট শ্রেণী (ব্যাপ্ত শ্রেণীর সহ) একজন উপস্থাপনার ক্ষেত্রে বস্তুর যেহেতু is_a()
শুধুমাত্র প্রয়োজন যে বস্তু যখন instantiated করা $allow_string
যুক্তি ডিফল্ট মান সেট করা হয় false
।
মূল
আসলে, is_a
একটি ফাংশন, যেখানে instanceof
একটি ভাষা গঠন। is_a
উল্লেখযোগ্যভাবে ধীর হবে (যেহেতু এটিতে কোনও ফাংশন কল কার্যকর করার সমস্ত ওভারহেড রয়েছে) তবে সামগ্রিকভাবে কার্যকর করার সময় উভয় পদ্ধতিতে ন্যূনতম।
এটি এখন 5.3 হিসাবে অবহেলিত নয়, সুতরাং সেখানে কোনও উদ্বেগ নেই।
তবে একটি পার্থক্য আছে। is_a
ফাংশন হওয়া প্যারামিটার 1 হিসাবে একটি বস্তু এবং প্যারামিটার 2 হিসাবে একটি স্ট্রিং (পরিবর্তনশীল, ধ্রুবক বা আক্ষরিক) লাগে takes সুতরাং:
is_a($object, $string); // <- Only way to call it
instanceof
প্যারামিটার 1 হিসাবে কোনও বস্তু নেয় এবং একটি বর্গের নাম (ভেরিয়েবল), অবজেক্ট দৃষ্টান্ত (ভেরিয়েবল), বা শ্রেণি শনাক্তকারী (কোট ছাড়াই লিখিত শ্রেণীর নাম) প্যারামিটার 2 হিসাবে নিতে পারে।
$object instanceof $string; // <- string class name
$object instanceof $otherObject; // <- object instance
$object instanceof ClassName; // <- identifier for the class
is_a
অবচয়হীন ছিল ?
$class = 'Foo'; var_dump($obj instanceof $class);
is_a
বনাম instanceof
অপারেটর সম্পর্কে আরও একটি বিষয় লক্ষণীয় হ'ল is_a
দ্বিতীয় প্যারামিটারের জন্য এক্সপ্রেশন গ্রহণ করবে, উদাহরণস্বরূপ ont উদাহরণস্বরূপ, is_a($object, 'Prefix_'.$name)
যখন কাজ $object instanceof 'Prefix_'.$name
করে না
is_a
প্রথম স্থানে কখনও অবহেলা করা উচিত ছিল না। এখনই ঠিক করতে দেরি হয়ে গেছে সমস্যাটি হ'ল instanceof
অপারেটরটি পিএইচপি 4-তে সিনট্যাক্স ত্রুটি ফেলে দেয় এবং is_a
অপারেটরটি প্রবর্তন করার সাথে সাথে একই সময়ে অবহেলা করা হয়েছিল এবং কোনও E_STRICT নিক্ষেপ না করে পিএইচপি 4 এবং 5 উভয়ের জন্য কোড লেখা অসম্ভব হয়ে পড়েছিল। আপনি এমনকি করতে পারেন না if (version_compare(PHP_VERSION, 5) >= 0) { /* use instanceof */ } else { /* use is_a */ }
কারণ এটি এখনও পিএইচপি 4
এখানে_আ (()) এর কার্যকারিতা ফলাফল এবং উদাহরণ রয়েছে :
Test name Repeats Result Performance
instanceof 10000 0.028343 sec +0.00%
is_a() 10000 0.043927 sec -54.98%
পরীক্ষার উত্স এখানে ।
php 7
কোন পার্থক্য আছে।
instanceof
অন্যান্য অবজেক্ট দৃষ্টান্ত, শ্রেণীর নাম বা একটি ইন্টারফেসের সাথে ব্যবহার করা যেতে পারে। আমি মনে করি না যে (আপডেট: https://gist.github.com/1455148 দেখুন )is_a()
ইন্টারফেসের সাথে কাজ করে (কেবলমাত্র একটি স্ট্রিং একটি শ্রেণীর নাম উপস্থাপন করে), তবে এটি যদি ঠিক করে তবে আমাকে সংশোধন করুন।
Php.net থেকে উদাহরণ :
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
আউটপুট:
bool(true)
bool(true)
bool(false)
is_a
ইন্টারফেসের সাথে একইভাবে কাজ করে instanceof
(আমি একই কথা বলতে যাচ্ছিলাম, তবে জমা দেওয়ার আগে আমি এটি পরীক্ষা করেছিলাম, এবং এটি প্রকৃতপক্ষে কার্যকর হয়) ...
ক্রিসএফের উত্তরের বিষয়ে, পিএইচপি 5.3.0 হিসাবে is_a()
আর অবচয় করা হয় না । আমি এ জাতীয় জিনিসের জন্য সরকারী উত্স থেকে যাওয়া সর্বদা নিরাপদ বলে মনে করি।
আপনার প্রশ্নের সাথে ড্যানিয়েল, আমি পারফরম্যান্সের পার্থক্য সম্পর্কে বলতে পারি না, তবে এর কিছু অংশ পাঠযোগ্যতার জন্য নেমে আসবে এবং যার সাথে আপনি কাজ করতে সহজ মনে করেন।
এছাড়াও, চেক বনাম উপেক্ষা করে প্রায় বিভ্রান্তি সম্পর্কে কিছু আলোচনা রয়েছে । উদাহরণস্বরূপ, আপনার জন্য এটি করবে:instanceof
is_a()
instanceof
<?php
if( !($a instanceof A) ) { //... }
?>
নিম্নলিখিতগুলির জন্য বনাম is_a()
:
<?php
if( !is_a($a, 'A' ) { //... }
?>
অথবা
<?php
if( is_a($a, 'A') === FALSE) { //... }
?>
সম্পাদনা দেখে মনে হচ্ছে ক্রিসএফ তার উত্তর মুছে ফেলেছে, তবে আমার উত্তরের প্রথম অংশটি এখনও আছে।
গতি ছাড়াও, আরও একটি গুরুত্বপূর্ণ পার্থক্য হ'ল তারা কীভাবে প্রান্তের মামলাগুলি পরিচালনা করে।
is_a($x1, $x2) // fatal error if x2 is not a string nor an object
$x1 instanceof $x2 // returns false even if $x2 is int, undefined, etc.
সুতরাং, is_a () সম্ভাব্য বাগগুলি হাইলাইট করে যখন উদাহরণস্বরূপ সেগুলি দমন করে।
অপ্টিমাইজেশন ন্যূনতম। কোডের পঠনযোগ্যতা, বোধগম্যতা এবং স্থিতিশীলতার সামনে মাইক্রো-অপটিমাইজেশনগুলি কখনই সত্যিকারের ভাল উত্তর হয় না।
(ব্যক্তিগতভাবে আমি উদাহরণ পছন্দ করি তবে পছন্দটি আপনার;))
মূল পার্থক্য হ'ল উদাহরণ সহ প্রত্যক্ষ শ্রেণীর নাম ব্যবহারের সম্ভাবনা
My মাইক্লাসের একটি উদাহরণ
এর চেয়ে কম
is_a ($ a, MyClass :: শ্রেণী)
(ঠিক আছে ... এটি তুচ্ছ নয়।)
উদাহরণস্বরূপ (ভাষার কাঠামো) এবং is_a এর মধ্যে সিনট্যাক্সিকাল রঙিনতা (আমার পক্ষে) খুব দরকারী। বড় ক্রিয়াকলাপ ফাংশন রঙ দেওয়া। এবং যদি একক ব্যবহারের জন্য উদাহরণস্বরূপ ডসের জন্য বেশি প্রথম বন্ধনী প্রয়োজন হয় না।
দ্রষ্টব্য: অবশ্যই মাইক্লাস :: শ্রেণীর পরিবর্তে আপনি একটি স্বল্প সরাসরি স্ট্রিং ব্যবহার করতে পারেন:
is_a ($ একটি, 'MyClass')
তবে একটি কোডে সরাসরি স্ট্রিং ব্যবহার করা ভাল অভ্যাস নয় ।
যদি আপনি সাধারণ স্ট্রিং এবং ক্লাসের নামগুলির মধ্যে পার্থক্য করতে পারেন তবে সিনট্যাক্সিক্যাল কোলরেশন আরও ভাল এবং আরও দরকারী। এবং ধ্রুবক শ্রেণীর নাম সহ নাম পরিবর্তন করা সহজ। বিশেষ আপনি যদি ওরফে দিয়ে নেমস্পেস ব্যবহার করেন।
তাহলে, আপনি কি_এ () ব্যবহার করেন ?
একই raason জন্য: পাঠযোগ্যতা এবং undestandability। (পছন্দটি আপনার) স্পেশালি যখন ব্যবহার করা হয় ! বা অন্যদের বুলিয়ান অপারেটরগুলি: is_a প্রথম বন্ধনীর সাথে আরও যুক্তিযুক্ত বলে মনে হয়।
যদি ($ একটি এবং (! ইস_এ ($ এ, মাই ক্লাস :: শ্রেণি)) বা হয়_এ ($ এ, মাইওথার ক্লাস :: শ্রেণি))
এর চেয়ে বেশি পঠনযোগ্য:
যদি ($ একটি এবং (! (মাই ক্লাসের একটি উদাহরণ)) বা (My মায়োথার ক্লাস)))
অন্য একটি ভাল কারণ হ'ল যখন আপনাকে ফাংশনে কলব্যাকের প্রয়োজন হয়। ( অ্যারে_ম্যাপের মতো ...) উদাহরণ কোনও ফাংশন নয়, এটি একটি ভাষা নির্মাণ, তাই আপনি এটি কলব্যাক হিসাবে ব্যবহার করতে পারবেন না।
এই ক্ষেত্রে, is_a দরকারী হতে পারে
আমি পারফরম্যান্সের জন্য কথা বলতে পারি না - আমি এখনও কিছু পরিমাপ করি নি - তবে আপনি কী চেষ্টা করছেন তার উপর নির্ভর করে এর সীমাবদ্ধতা রয়েছে instanceof
। আমার প্রশ্নটি দেখুন, সম্প্রতি সম্পর্কে এটি সম্পর্কে:
পিএইচপি 'উদাহরণস্বরূপ' ক্লাস ধ্রুবক সঙ্গে ব্যর্থ
আমি is_a
পরিবর্তে ব্যবহার শেষ । আমি আরও instanceof
ভাল কাঠামো পছন্দ করি (আমার মনে হয় এটি ভাল পড়ে) এবং আমি যেখানে পারি সেখানে এটি ব্যবহার চালিয়ে যাব।
এখানে থেকে প্রাপ্ত কর্মক্ষমতা ফলাফল হয় এখানে :
instanceof
দ্রুততর.
ক্রিয়াকলাপ
function method_1($a = null) {
return is_object($a) && is_a($a, 'Example');
}
function method_2($a = null) {
return is_a((object) $a, 'Example');
}
function method_3($a = null) {
return $a instanceof 'Example';
}
টাইমস (প্রতিটি 5000 বার চালান)
0.00573397 // method_1(5)
0.01437402 // method_2(5)
0.00376201 // method_3(5)
এমন একটি দৃশ্য রয়েছে যেখানে কেবল is_a()
কাজ করে এবং instanceof
ব্যর্থ হবে।
instanceof
একটি আক্ষরিক শ্রেণীর নাম বা একটি পরিবর্তনশীল প্রত্যাশা করে যা হয় কোনও বস্তু বা একটি স্ট্রিং (শ্রেণীর নাম সহ) এর সঠিক যুক্তি হিসাবে।
তবে আপনি যদি কোনও ফাংশন কল থেকে কোনও শ্রেণীর নামের স্ট্রিং সরবরাহ করতে চান তবে এটি কাজ করবে না এবং ফলাফলের সিন্টেক্স ত্রুটি ঘটবে।
যাইহোক, একই দৃশ্যের সাথে ঠিক কাজ করে is_a()
।
উদাহরণ:
<?php
function getClassName() : string
{
return "Foobar";
}
class Foobar
{
private $xyz;
}
$x = new Foobar();
// this works of course
var_dump($x instanceof Foobar);
// this creates a syntax error
var_dump($x instanceof getClassName());
// this works
var_dump(is_a($x, getClassName()));
এটি পিএইচপি 7.2.14 এর উপর ভিত্তি করে।