পিএইচপি-র জেনেরিক্সের অভাবের আশেপাশে এমন কোনও শালীন কাজ রয়েছে যা স্থির কোড পরিদর্শনকে ধরণের ধারাবাহিকতা সনাক্ত করতে দেয়?
আমার একটি বিমূর্ত শ্রেণি আছে, আমি উপ-শ্রেণি করতে চাই এবং এটি প্রয়োগ করতে চাই যে একটি পদ্ধতির এক ধরণের পরামিতি নেওয়া থেকে একটি পরামিতি নেওয়া যা সেই প্যারামিটারের একটি সাব-ক্লাস।
abstract class AbstractProcessor {
abstract function processItem(Item $item);
}
class WoodProcessor extends AbstractProcessor {
function processItem(WoodItem $item){}
}
পিএইচপি-তে এটি অনুমোদিত নয় কারণ এটি পদ্ধতি স্বাক্ষর পরিবর্তন করছে যা অনুমোদিত নয়। জাভা স্টাইল জেনারিকের সাহায্যে আপনি এরকম কিছু করতে পারেন:
abstract class AbstractProcessor<T> {
abstract function processItem(T $item);
}
class WoodProcessor extends AbstractProcessor<WoodItem> {
function processItem(WoodItem $item);
}
তবে অবশ্যই পিএইচপি তাদের সমর্থন করে না support
গুগল এই সমস্যার জন্য, লোকেরা instanceof
রান-টাইমে যেমন ত্রুটিগুলি পরীক্ষা করতে ব্যবহার করার পরামর্শ দেয়
class WoodProcessor extends AbstractProcessor {
function processItem(Item $item){
if (!($item instanceof WoodItem)) {
throw new \InvalidArgumentException(
"item of class ".get_class($item)." is not a WoodItem");
}
}
}
তবে এটি কেবল রানটাইম এ কাজ করে, এটি আপনাকে স্থিতিশীল বিশ্লেষণ ব্যবহার করে ত্রুটির জন্য আপনার কোডটি পরীক্ষা করার অনুমতি দেয় না - সুতরাং পিএইচপি-তে এটি পরিচালনা করার কোনও বুদ্ধিমান উপায় আছে কি?
সমস্যার আরও সম্পূর্ণ উদাহরণ হ'ল:
class StoneItem extends Item{}
class WoodItem extends Item{}
class WoodProcessedItem extends ProcessedItem {
function __construct(WoodItem $woodItem){}
}
class StoneProcessedItem extends ProcessedItem{
function __construct(StoneItem $stoneItem){}
}
abstract class AbstractProcessor {
abstract function processItem(Item $item);
function processAndBoxItem(Box $box, Item $item) {
$processedItem = $this->processItem($item);
$box->insertItem($item);
}
//Lots of other functions that can call processItem
}
class WoodProcessor extends AbstractProcessor {
function processItem(Item $item) {
return new ProcessedWoodItem($item); //This has an inspection error
}
}
class StoneProcessor extends AbstractProcessor {
function processItem(Item $item) {
return new ProcessedStoneItem($item);//This has an inspection error
}
}
কারণ আমি শুধু একটি পার করছি Item
করার new ProcessedWoodItem($item)
এবং এটি প্যারামিটার হিসাবে একটি WoodItem আশা, কোড পরিদর্শন প্রস্তাব দেওয়া একটি ত্রুটি নেই।