পিএইচপি মধ্যে ক্লাস সদস্যদের আরম্ভ করার জন্য সেরা অনুশীলন


10

আমার কনস্ট্রাক্টরগুলিতে আমার প্রচুর কোড রয়েছে: -

function __construct($params) {

    $this->property = isset($params['property']) ? $params['property'] : default_val;

}

সম্পত্তির সংজ্ঞাতে ডিফল্ট মান উল্লেখ করার চেয়ে এটি করা কি ভাল? অর্থাৎ public $property = default_val? কখনও কখনও ডিফল্ট মানটির জন্য যুক্তি থাকে, এবং কিছু বৈশিষ্ট্য অন্যান্য বৈশিষ্ট্য থেকে নেওয়া হয়, যার কারণেই আমি কনস্ট্রাক্টরে এটি করছিলাম।

ডিফল্ট মানগুলির জন্য সমস্ত যুক্তি আলাদা করা হলে আমি কি সেটারগুলি ব্যবহার করব?

উত্তর:


8

আমি এর আগে আমার সাথে এই জাতীয় দার্শনিক বিতর্ক করেছি। আমি বেশিরভাগ সময় এখানে দাঁড়িয়েছি যদিও আমি বুঝতে পারি এটি একটি মতামত ভিত্তিক উত্তর:

একটি জিনিস যা আমি দেখতে পাচ্ছি যে প্রশ্নের উত্তর দিতে সহায়তা করতে পারে তা হ'ল $ প্যারামগুলি পাশ করা যা বৈশিষ্ট্য / অ্যারে সদস্যদের সেট করা থাকতে পারে বা নাও থাকতে পারে।

বছরের পর বছর ধরে আমি এই সিদ্ধান্তে পৌঁছেছি:

অ্যারে পাস করা এড়িয়ে চলুন।

কেন? ওয়েল, setচ্ছিক পাস হওয়া আর্গুমেন্টগুলির জন্য সংজ্ঞা নির্ধারণের বা সেন্ডিনেল মানানোর কোনও উপায় নেই।

অন্য কথায়, আপনি নির্দিষ্ট কোড সহ, আপনি এর মতো কিছু করতে পারবেন না:

function __construct($arg1 = NULL, $arg2 = DEFAULT_VAL) {

    $this->arg1 = $arg1;

    $this->arg2 = $arg2;

}

$ আরজি 1 এবং $ আরজি 2 হ'ল alচ্ছিক যুক্তি passed যদি পাস না হয় তবে তাদের যথাক্রমে NULL এবং DEFAULT_VAL থাকে - সুস্পষ্টভাবে পরীক্ষা করার প্রয়োজন নেই।

হতে পারে এটি একরকম স্বেচ্ছাচারী বলে মনে হচ্ছে।

আমি মনে করি আপনি যা অর্জন করার চেষ্টা করছেন তা পেয়েছি - বহু সংখ্যক যুক্তি বিরোধী হিসাবে একটি একক রেফারেন্স পাস করা। এটি আমার পরবর্তী উপসংহারে নিয়ে আসে:

যদি "পারমাণবিক" ভেরিয়েবলগুলি (স্ট্রিংস, পূর্ণসংখ্যা, আক্ষরিক) পাস না করে তবে অবজেক্টগুলি পাস করুন।

এখানে পারফরম্যান্স সুবিধাগুলি যেহেতু পাস করা অবজেক্টগুলি রেফারেন্সের মাধ্যমে সম্পন্ন হয় (যদিও অ্যারেগুলি আমি মনে করি পিএইচপি-র মধ্যে প্রায় একই রকম)।

সুতরাং আপনি যেমন কিছু করতে পারেন:

function __construct(MyAwesomeObject $oArg) {

        $this->oArg = $oArg;

    }

উত্তীর্ণ অবজেক্ট আর্গুমেন্টটি সম্ভবত "সম্পত্তি1", "সম্পত্তি2" সম্ভবত নিজেরাই ডিফল্ট মানগুলির সাথে গ্যারান্টিযুক্ত হবে।

অতিরিক্ত হিসাবে, এখানে আপনি ইঙ্গিতটি টাইপ করতে পারেন এবং একটি ভাল আইডিই সঠিকভাবে কোড সমাপ্তিরও অটোসগাস্ট করবে।

তবে আমরা দ্রুত বুঝতে পারি যে আমাদের একটি মুরগি এবং একটি ডিমের জিনিস চলছে: আপনি পাস করা অবজেক্ট যুক্তি দিয়ে একটি বস্তু তৈরি করছেন যা তাদের নিজেরাই কোনও পর্যায়ে নির্মাণের প্রয়োজন।

তাহলে এটি আমাদের ছেড়ে কোথায় যায়? ভাল, আমি এই সিদ্ধান্তে পৌঁছেছি যে অবশেষে সমস্ত শ্রেণি উন্নত শর্তের অভাবে "পারমাণবিক" ভেরিয়েবলগুলি (স্ট্রিংস, ফ্লোটস, ডাবলস, ইনটস, রিসোর্সগুলি যে আপনি আমার পয়েন্টটি পেয়েছেন) অবিচ্ছিন্ন হয়ে যায় এবং আমি চেষ্টা করার ঝোঁক এই পরিবর্তনশীল ধরণের বা অবজেক্টের সাথে সমস্ত শ্রেণি নির্মান করতে - তবে অ্যারে নয়।

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

এখন, এটি আপনার ইনপুটটি স্যানিটাইজ করা উচিত নয় বলে নয়। এটি পুরোপুরি আরেকটি আলোচনা।

আশাকরি এটা সাহায্য করবে.


1
এটি একটি ভাল পয়েন্ট, এবং IDE অনুরোধের জন্য খুব সুবিধাজনক কিন্তু সেগুলি পরামিতি হিসাবে পাস করার জন্য অনেকগুলি অবজেক্ট বৈশিষ্ট্য রয়েছে। যদি আপনার 7 টি যুক্তি যুক্ত থাকে তবে 5 new object($param1,-some default value so I can specify the next parameter-, $param3);
টির মধ্যে optionচ্ছিক আপনি যেমন পছন্দসই

3

যদিও আমি কোনও কন্সট্রাক্টরের কাছে অ্যারেগুলি এড়ানোর প্রবণতা রাখি, কখনও কখনও আমি আগত অ্যারে মান প্রক্রিয়া করা প্রয়োজন বলে মনে করি (যেমন কোনও শ্রেণীর ক্ষেত্রে যা একটি কনফিগারেশন ফাইল থেকে মানগুলি পড়ে)।

এর মতো ক্ষেত্রে আমি পিএইচপি'র অ্যারে ফাংশনগুলির সুবিধা গ্রহণ করব তা নিশ্চিত করার জন্য যে আমি যা ভাবছি ঠিক তার সাথে কাজ করছি:

public function import( array $incoming )
{
  $defaults = array(
      'foo' => DEFAULT_FOO
    , 'bar' => DEFAULT_BAR
    ...
  );

  $values = array_merge($defaults, array_intersect_key($incoming, $defaults));

  ...
}

যে শেষ লাইনটি array_merge()কোনও $defaultsমানগুলি থেকে তাদের সম্পর্কিত মানগুলির সাথে ওভাররাইট করতে ব্যবহার করে $incoming। আমি আরও array_intersect_key()নিশ্চিত করেছি যে ফলস্বরূপ অ্যারেতে কোনও অতিরিক্ত কী নেই যা শ্রেণি / পদ্ধতিটি কীভাবে প্রক্রিয়া করতে হবে তা না জানায়।


হ্যালো, যদি vari ডিফল্টগুলিতে সরল ভেরিয়েবলের পরিবর্তে একটি অ্যারে থাকে তবে তার আচরণটি কী?
পোল ডেলিয়েরা

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