পদ্ধতির ঘোষণাটি পিএইচপি-তে পিতামাতার পদ্ধতির সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত


107
কড়া স্ট্যান্ডার্ডস: চাইল্ডক্লাসের ঘোষণা :: কাস্টমমেথড () প্যারেন্টক্লাসের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত :: কাস্টমথথ ()

পিএইচপি-তে এই ত্রুটির সম্ভাব্য কারণগুলি কী কী? সামঞ্জস্যপূর্ণ হওয়ার অর্থ কী তা সম্পর্কে আমি কোথায় তথ্য পেতে পারি ?


না জিম এর ঠিক আছে। @ ওয়াইওয়াই ৯৩৩, আপনি যদি function customMethod( ... )প্রতিটি ফাংশনের জন্য শিরোনাম (কেবল প্রথম লাইন :) পোস্ট করতে পারতেন তবে আমরা আপনাকে নির্দিষ্ট সমস্যাটি বলতে পারতাম
নিক

ত্রুটি বার্তা এবং পিএইচপি সম্পর্কিত সংক্ষিপ্ত বিবরণ সম্পর্কে আরও বিশদ: বাগস.এফপিএন
বুগ.এফপি?


1
আমার সমস্যাটি ছিল যে কোনও যুক্তি টাইপ-ইঙ্গিতযুক্ত ছিল তবে তখন আমি use Closure;আমার ক্লাসের শীর্ষে যোগ করিনি (যেহেতু টাইপ-ইঙ্গিতটি ছিল Closure)। সুতরাং ... আপনি যেমন নির্ভরতা অনুপস্থিত তা পরীক্ষা করে নিশ্চিত হন।
রায়ান ২

উত্তর:


126

childClass::customMethod()এর চেয়ে আলাদা যুক্তি বা ভিন্ন অ্যাক্সেস স্তর (পাবলিক / প্রাইভেট / সুরক্ষিত) রয়েছে parentClass::customMethod()


1
সম্ভবত এটি কারণ দৃশ্যমানতা , পদ্ধতিগুলির স্বাক্ষর পিএইচপি-তে কোনও সমস্যা নয়
গ্যাব্রিয়েল সোসা

43
একই সঠিক যুক্তির ডিফল্ট মানগুলি থাকাও গুরুত্বপূর্ণ। উদাহরণস্বরূপ, parentClass::customMethod($thing = false)এবং childClass::customMethod($thing)ত্রুটিটি ট্রিগার করবে, কারণ সন্তানের পদ্ধতিটি প্রথম যুক্তির জন্য একটি ডিফল্ট মান নির্ধারণ করে না।
চার্লস

1
আমি বিশ্বাস করি দৃশ্যমানতা আসলে একটি ভিন্ন ত্রুটি। যাইহোক, আমার দোকানে আমরা কঠোর মোড ব্যবহার করি না, এর কারণে (আমরা E_ALL, IIRC ব্যবহার করি)।
ডেভিডটবার্নাল

12
এটি পিএইচপি 5.4, বিটিডব্লুতে পরিবর্তিত হয়েছে: * E_ALL এ এখন ত্রুটি_বন্দরের কনফিগারেশন নির্দেশিকায় E_STRICT স্তর ত্রুটি অন্তর্ভুক্ত করে। এখানে দেখুন: php.net/manual/en/migration54.other.php
ডানকান লক

1
&আর্গুমেন্টে একটি অ্যাম্পারস্যান্ড ( ) মিস করা এই ত্রুটিটিকেও ট্রিগার করতে পারে।
ইভানআরএফ 21'14

36

এই বার্তাটির অর্থ এমন কিছু সম্ভাব্য পদ্ধতি কল রয়েছে যা রান-টাইমে ব্যর্থ হতে পারে। ধরুন আপনার আছে

class A { public function foo($a = 1) {;}}
class B extends A { public function foo($a) {;}}
function bar(A $a) {$a->foo();}

সংকলক কেবল এ :: foo () এর প্রয়োজনীয়তার বিপরীতে কল $ a-> foo () চেক করে যার কোনও প্যারামিটার প্রয়োজন নেই। $ এ তবে ক্লাস বি এর একটি অবজেক্ট হতে পারে যার জন্য একটি প্যারামিটার প্রয়োজন এবং তাই কলটি রানটাইমে ব্যর্থ হবে।

এটি তবে কখনও ব্যর্থ হতে পারে না এবং ত্রুটিটি ট্রিগার করে না

class A { public function foo($a) {;}}
class B extends A { public function foo($a = 1) {;}}
function bar(A $a) {$a->foo();}

সুতরাং কোনও পদ্ধতির কাছে তার প্যারেন্ট পদ্ধতির চেয়ে বেশি প্রয়োজনীয় প্যারামিটার থাকতে পারে।

টাইপ ইঙ্গিতগুলি মেলে না, একই বার্তাটিও উত্পন্ন হয় তবে এই ক্ষেত্রে পিএইচপি আরও সীমাবদ্ধ। এটি একটি ত্রুটি দেয়:

class A { public function foo(StdClass $a) {;}}
class B extends A { public function foo($a) {;}}

এটি যেমন করে:

class A { public function foo($a) {;}}
class B extends A { public function foo(StdClass $a) {;}}

এটি হওয়া দরকারের চেয়ে বেশি সীমাবদ্ধ বলে মনে হচ্ছে এবং আমি ধরে নিই অভ্যন্তরীণ কারণে is

দৃশ্যমানতা পার্থক্য একটি পৃথক ত্রুটি ঘটায়, কিন্তু একই বেসিক কারণে। কোনও পদ্ধতি তার পিতামাতার পদ্ধতির চেয়ে কম দৃশ্যমান হতে পারে না।


2
আপনার শেষ উদাহরণে - এখানে কোনও ত্রুটি হওয়া উচিত নয় কারণ এটি বৈধ, stdClass mixed একটি মিশ্রের চেয়ে আরও বেশি প্রতিবন্ধী $ এ। এই কাছাকাছি পেতে একটি উপায় আছে? আমার অর্থ এই ক্ষেত্রে পিএইচপি এর এটির অনুমতি দেওয়া উচিত তবে এটি এখনও একটি ত্রুটি দেয় ...
গ্যালচেন

2
আপনার সর্বশেষ উদাহরণটি টাইপ-নিরাপদ, সুতরাং এটি অবশ্যই "এটি যতটা প্রয়োজন তত বেশি বিধিনিষেধযুক্ত"। এই পণ্যসম্ভার-অর্চনা প্রোগ্রামিং এর একটি মামলা হতে পারে যেহেতু এটি সি পলিমরফিজম সাথে সংঘাত ++ এবং জাভা en.wikipedia.org/wiki/...
Warbo

ব্যাখ্যার জন্য ধন্যবাদ, আমার ক্ষেত্রে আপনি যে প্রথম উদাহরণ দিয়েছেন তা হ'ল যা আমার ত্রুটিটি ট্রিগার করেছিল।
বিলেন্নো

স্যার এই জন্য আপনাকে ধন্যবাদ।
Eldoïr

22

আপনি যদি কোনও ত্রুটি বন্ধ না করেই ওওপি ফর্মটি রাখতে চান তবে আপনি এটিও করতে পারেন:

class A
{
    public function foo() {
        ;
    }
}
class B extends A
{
    /*instead of : 
    public function foo($a, $b, $c) {*/
    public function foo() {
        list($a, $b, $c) = func_get_args();
        // ...

    }
}

আমি এই ত্রুটিগুলি প্রায় পেতে এই হ্যাক ব্যবহার করতে চাই। আমি আশঙ্কা করছি যে এই পদ্ধতির কোনও পারফরম্যান্স পেনাল্টি হতে পারে? আমি এটি নিয়ে গবেষণা করব তবে আপনার যদি সেই প্রশ্নের উত্তর দেওয়ার জন্য কোনও উত্স থাকে তবে তা দুর্দান্ত be
অ্যাডাম ফ্রিডম্যান

পরিস্থিতি আমার অনুমানের উপর নির্ভর করে। এখনও হ্যাঁ এটি সম্ভবত কিছুটা হ্যাকি, তবে এটি পিএইচপি? ইতিমধ্যে, কখনও কখনও এটি চারপাশে একটি দুর্দান্ত কাজ হতে পারে, ধন্যবাদ! <@
মাস্টার জেমস

তুমি আমার দিন বাঁচিয়েছ! এই ব্যথা ছাড়াই পিএইচপি 7 সহ সার্ভারে লিগ্যাসি পিএইচপি 5 প্রকল্প চালু করার একমাত্র বিকল্প ছিল
ভ্লাদক্রাস

এই ক্ষেত্রে জন্য আপনি পরিবর্তে ডিফল্ট মান ব্যবহার করতে পারেন func_get_args(), অর্থাত্, মধ্যে B, public function foo($a = null, $b = null, $c = null)এই ভাঙে না হিসাবে চুক্তি প্রতিশ্রুত A
জেক

1

কোনও ইন্টারফেসের প্রসঙ্গে এই ত্রুটিটি প্রসারিত করার জন্য, আপনি যদি নিজের ফাংশনগুলির পরামিতিগুলিকে ইঙ্গিত দিচ্ছেন:

ইন্টারফেস এ

use Bar;

interface A
{
    public function foo(Bar $b);
}

ক্লাস বি

class B implements A
{
    public function foo(Bar $b);
}

আপনি যদি useনিজের প্রয়োগকারী ক্লাসের (ক্লাস বি) বিবৃতিটি অন্তর্ভুক্ত করতে ভুলে গিয়ে থাকেন তবে পদ্ধতির পরামিতিগুলি অভিন্ন হলেও আপনিও এই ত্রুটিটি পাবেন।


0

গিটহাব থেকে বিদ্যমান ক্লাসটি বাড়ানোর চেষ্টা করার সময় আমি এই সমস্যার মুখোমুখি হয়েছি। আমি নিজেকে ব্যাখ্যা করার চেষ্টা করব, প্রথমে ক্লাসটি যেমন হওয়া উচিত ঠিক তেমন লিখছি এবং তারপরে ক্লাসটি এখন যেমন রয়েছে তেমন।

আমি যদিও

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

আমি শেষ পর্যন্ত কি করেছি

namespace mycompany\CutreApi;

use \vendor\AwesomeApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function whatever(): ClassOfVendor
   {
        return new \mycompany\CutreApi\ClassOfVendor();
   }
}

সুতরাং মনে হচ্ছে যে আপনি যখন কোনও নেমস্পেস ক্লাস ফিরিয়ে দেন এমন কোনও পদ্ধতি ব্যবহার করছেন তখন আপনি এই ভুলটি উত্থাপন করেছেন এবং আপনি একই শ্রেণিটি ফেরত দেওয়ার চেষ্টা করছেন তবে অন্যান্য নামস্থান সহ। ভাগ্যক্রমে আমি এই সমাধানটি পেয়েছি, তবে আমি পিএইচপি 7.২ এ এই বৈশিষ্ট্যটির সুবিধাটি পুরোপুরি বুঝতে পারি না, আমার কাছে বিদ্যমান শ্রেণি পদ্ধতিগুলি যেমন আপনার প্রয়োজন তেমন পুনরায় লেখার পক্ষে স্বাভাবিক, ইনপুট পরামিতিগুলির পুনরায় সংজ্ঞা এবং / অথবা এমনকি এর আচরণ সহ পদ্ধতি।

পূর্ববর্তী অ্যাপ্রোচগুলির একটি নেতিবাচক দিকটি হ'ল আইডিই \ মাইকম্পানি \ কাট্রেএপি \ ClassOfVendor () এ প্রয়োগ করা নতুন পদ্ধতিগুলি সনাক্ত করতে পারেনি। সুতরাং, আপাতত, আমি এই বাস্তবায়ন নিয়ে যাব।

বর্তমানে সম্পন্ন

namespace mycompany\CutreApi;

use mycompany\CutreApi\ClassOfVendor;

class CutreApi extends \vendor\AwesomeApi\AwesomeApi
{
   public function getWhatever(): ClassOfVendor
   {
        return new ClassOfVendor();
   }
}

সুতরাং, "যাই হোক না কেন" পদ্ধতিটি ব্যবহার করার চেষ্টা করার পরিবর্তে, আমি "গেটউইউজিং" নামে একটি নতুন লিখেছিলাম। প্রকৃতপক্ষে উভয়ই একই কাজ করছে, কেবল একটি ক্লাস ফিরিয়ে দিচ্ছে, তবে আমি আগে বর্ণনা করেছি যেমন ডাইফেরেন্টস নেমস্পেস দিয়ে।

আশা করি এটি কারও সাহায্য করতে পারে।

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