পিএইচপিডোকের ধরণের অবজেক্টগুলির জন্য ইঙ্গিত দিচ্ছেন?


417

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

<?php
  class Test
  {
    /** @var SomeObj */
    private $someObjInstance;
  }
?>

এটি পরে কাজ করে যখন আমি যখন those অবজেক্টগুলির মধ্য দিয়ে পুনরাবৃত্তি করি তখন সঠিক ইঙ্গিত পেতে সক্ষম হওয়ার জন্য অবজেক্টগুলির একটি অ্যারের সাথে একই কাজ করার দরকার না হওয়া পর্যন্ত এটি দুর্দান্ত কাজ করে।

সুতরাং, সদস্য ভেরিয়েবল SomeObjs এর একটি অ্যারে উল্লেখ করার জন্য কোনও PHPDoc ট্যাগ ঘোষণার উপায় আছে কি ? @varঅ্যারে যথেষ্ট নয়, এবং @var array(SomeObj)এটি বৈধ বলে মনে হয় না, উদাহরণস্বরূপ।



3
@ এখানে থেকে: আপনার লিঙ্কটি নষ্ট হয়েছে। আমি মনে করি যে নতুন ইউআরএল হ'ল: ব্লগস.অরাকল.com
এন্ট্রি

আমার মতো লোকদের কাছে, উত্তরটি পাশ দিয়ে চলেছে: আপনি যদি পিএইচপিএসটারম ব্যবহার করেন তবে সর্বাধিক ভোট দেওয়া উত্তরটি দেখুন: এতে একটি নির্দিষ্ট ইঙ্গিত রয়েছে! stackoverflow.com/a/1763425/1356098 (এর অর্থ এই নয় যে এটি ওপি-র উত্তর হওয়া উচিত, যেহেতু তিনি পিএইচপিইডের জন্য জিজ্ঞাসা করছেন)
ইরেনর পাজ

উত্তর:


337

ব্যবহার করুন:

/* @var $objs Test[] */
foreach ($objs as $obj) {
    // Typehinting will occur after typing $obj->
}

যখন ইনলাইন ভেরিয়েবলগুলি টাইপ করুন, এবং

class A {
    /** @var Test[] */
    private $items;
}

শ্রেণীর সম্পত্তি জন্য।

'09 এর পূর্ববর্তী উত্তর যখন পিএইচপিডোক (এবং জেনড স্টুডিও এবং নেটবিনের মতো আইডিই) তেমন বিকল্প ছিল না:

আপনি সবচেয়ে ভাল করতে পারেন তা হল,

foreach ($Objs as $Obj)
{
    /* @var $Obj Test */
    // You should be able to get hinting after the preceding line if you type $Obj->
}

জেন্ড স্টুডিওতে আমি তা অনেক করি। অন্যান্য সম্পাদক সম্পর্কে জানেন না, তবে এটি কাজ করা উচিত।


3
এটি অর্থবোধ করে তবে এটি পিএইচপিইড 5.2 এর জন্য কাজ করে না। আমি যে কাজটি করতে পেরেছি তা হ'ল ফোরচ ($ ওবজ হিসাবে / ** @vv টেস্ট * / $ ওবজ), যা মারাত্মকভাবে কুৎসিত। :(
আর্টেম রাশাকোভস্কিই

14
নেটবিন্স 7-এ নোটটি গুরুত্বপূর্ণ বলে মনে হচ্ছে আপনার কাছে কেবল একটি নক্ষত্র রয়েছে - /** @var $Obj Test */কাজ করে না।
অবিরত

3
@ কনট্রেবিস: "@var" একটি বৈধ ডকব্লক ট্যাগ। এমনকি যদি আপনার আইডিই এটি কোনও ডকব্লক "/ ** ... /" এর মধ্যে সমর্থন না করে এবং শুধুমাত্র "/ ... * /" "" ভিভার " সমর্থন করে - দয়া করে আপনার সঠিক ডকব্লকটি পরিবর্তন করবেন না। আপনার আইডিই স্ট্যান্ডার্ডের সাথে সামঞ্জস্যপূর্ণ করতে আপনার আইডিই এর বাগ ট্র্যাকারে একটি সমস্যা ফাইল করুন। আপনার উন্নয়ন দল / বাহ্যিক বিকাশকারী / সম্প্রদায় বিভিন্ন আইডিই ব্যবহার করে তা কল্পনা করুন। এটি যেমন আছে তেমন রাখুন এবং ভবিষ্যতের জন্য প্রস্তুত থাকুন।
ড্যানিয়েলাওয়ারাণী

181
আপনি নীচে দেখতে নিশ্চিত করুন! আমি প্রায় স্ক্রোল না - একটি বড় ভুল হতে পারে !!! অনেক আইডিই আরও ভাল সিনট্যাক্স সমর্থন করবে! (ইঙ্গিত: @var Object[] $objectsবলে যে "$ অবজেক্টস" অবজেক্টের উদাহরণগুলির একটি অ্যারে।)
থম পোর্টার

10
/** @var TYPE $variable_name */সঠিক বাক্য গঠন; টাইপ এবং ভেরিয়েবল নামের ক্রমটিকে বিপরীত করবেন না (যেমন আগে মন্তব্যগুলিতে বলা হয়েছে) যেটি সমস্ত ক্ষেত্রেই কাজ করে না।
srcspider

893

জেটব্রেইনস থেকে পিএইচপিস্টোরম আইডিইতে আপনি ব্যবহার করতে পারেন /** @var SomeObj[] */, যেমন:

/**
 * @return SomeObj[]
 */
function getSomeObjects() {...}

Phpdoc ডকুমেন্টেশন এই পদ্ধতি বিশেষ পরামর্শ দেওয়া হচ্ছে:

একটি একক টাইপযুক্ত নির্দিষ্ট, টাইপ সংজ্ঞা প্রতিটি অ্যারে উপাদান টাইপ পাঠককে অবহিত করে। প্রদত্ত অ্যারেগুলির জন্য উপাদান হিসাবে কেবলমাত্র একটি প্রকার প্রত্যাশিত।

উদাহরণ: @return int[]


10
আমি সবেমাত্র ডাউনলোড করেছি এবং গত সপ্তাহের জন্য পিএইচপিস্টর্ম ব্যবহার করছি। আপ্টানা (যা বিনামূল্যে থাকার জন্য দুর্দান্ত) হ্যাককে বিট দেয়। আমি ঠিক এটিই খুঁজছিলাম। আসলে, আপনি জাভাস্ক্রিপ্টের জন্য এটি একইভাবে করেছিলেন, আমার অনুমান করা উচিত ছিল
জুয়ান মেন্ডেস

3
ধন্যবাদ মানুষ! আমি ঠিক এটিই খুঁজছিলাম। PHPStorm চমত্কার।
এরিক শিয়েরবুম

5
এটি নেটবিনে কাজ করে না, আমি হতাশ। জেটব্রেনগুলি খুব সুন্দর কিছু সরঞ্জাম তৈরি করে।
কিও

10
@ ফিশবোন @ কেইও এখন নেটবিনে এটি কাজ করে (.1.১ এর মধ্যে নাইট কমপক্ষে কমপক্ষে, সম্ভবত আগে) জন্য ইঙ্গিত foreach(getSomeObjects() as $obj)কাজ করে না, কিন্তু এটা জন্য করে$objs = getSomeObjects(); foreach($objs as $obj)
জন কার্টার

2
@var Obj[string]সহযোগী অ্যারেগুলির জন্য ভাল লাগবে ।
donquixote

59

নেটবিনের ইঙ্গিত:

আপনি ব্যবহারকারী ক্লাসগুলির একটি অ্যারের জন্য $users[0]->এবং এর জন্য কোড সমাপ্তি পান $this->

/**
 * @var User[]
 */
var $users = array();

ক্লাস সদস্যদের তালিকায় আপনি অ্যারের ধরণটিও শেষ করতে পারেন $this->...


4
পিএইচপিস্টোরম 9 ইএপি-তেও কাজ করে: / ** * @var ইউজার ইন্টারফেস [] * / var $ ব্যবহারকারীরা = []; // একটি ইন্টারফেস প্রয়োগকারী ওবজের অ্যারে
রোনান

আমি NetBeans আইডিই 8.0.2 এটা চেষ্টা করেছি, কিন্তু এটা আমি পেতে ক্লাস থেকে পরামর্শ আমি বর্তমানে আছি।
Wojciech Jasiński

Eclipse 4.6.3 এও কাজ করে (আইডিকে কি সংস্করণ সমর্থন প্রবর্তন করা হয়েছিল, তবে এটির কাজ, এবং এটি এখন আমি কী ব্যবহার করছি)
hanshenrik

দুর্ভাগ্যক্রমে এটি array_pop()কোনও কারণে ব্যবহার করার জন্য বা অনুরূপ ফাংশনগুলির পরে কাজ করে না । দেখে মনে হচ্ছে যে নেটবিনগুলি সেই ফাংশনগুলি বুঝতে পারে না যে ইনপুট অ্যারের একক উপাদান ফেরত দেয়।
উইলিয়াম ডাব্লু

29

একটি ভেরিয়েবল নির্দিষ্ট করতে অবজেক্টগুলির একটি অ্যারে:

$needles = getAllNeedles();
/* @var $needles Needle[] */
$needles[1]->...                        //codehinting works

এটি নেটবিন 7.২ এ কাজ করে (আমি এটি ব্যবহার করছি)

এর সাথেও কাজ করে:

$needles = getAllNeedles();
/* @var $needles Needle[] */
foreach ($needles as $needle) {
    $needle->...                        //codehinting works
}

সুতরাং এর ভিতরে ঘোষণাপত্র ব্যবহারের foreachপ্রয়োজন নেই।


2
এই দ্রষ্টব্যটি আমার দৃষ্টিতে গৃহীত উত্তরের চেয়ে পরিষ্কার, কারণ আপনি একাধিক বার ফোরচ ব্যবহার করতে পারেন এবং হিন্টিং টাইপটি /* @var $Obj Test */প্রতিবার নতুন টীকা দিয়ে কাজ চালিয়ে যাবে ।
হেনরি

আমি এখানে দুটি সমস্যা দেখছি: 1. যথাযথ পিএইচপিডোক /** 2 দিয়ে শুরু হয় 2 সঠিক বিন্যাসটি হল@var <data-type> <variable-name>
খ্রিস্টান

@ ক্রিশ্চিয়ান ১: মূল প্রশ্নটি পিএইচপিডোক নয় বরং টাইপহিন্টিং 2: সঠিক ফর্ম্যাটটি আপনি যেমন বলছেন ঠিক তেমন নয়, এমনকি অন্যান্য উত্তর অনুসারে। প্রকৃতপক্ষে, আমি আপনার মন্তব্যে 2 টি সমস্যা দেখছি এবং আমি ভাবছি কেন আপনি সঠিক উত্তরটি দিয়ে নিজের উত্তরটি কেন
ছাপিয়ে উঠছেন না

১. টাইপহিন্টিং পিএইচপিডোকের সাথে কাজ করে ... আপনি যদি ডকব্লকটি ব্যবহার না করেন তবে আপনার আইডিই আপনি কিছু র্যান্ডম মন্তব্যে কী লিখেছেন তা অনুমান করার চেষ্টা করবে না। ২. সঠিক ফর্ম্যাট, যেমন অন্য কয়েকটি উত্তরও বলেছে যে এটি আমি উপরে বর্ণিত; ভেরিয়েবল নামের আগে ডেটা টাইপ৩. আমি আর একটি উত্তর লিখিনি কারণ প্রশ্নটির অন্য কোনওটির প্রয়োজন নেই এবং আমি কেবল আপনার কোডটি সম্পাদনা করব না।
খ্রিস্টান

24

পিএসআর -5: পিএইচপিডোক জেনারিক্স-স্টাইল স্বরলিপি একটি ফর্ম প্রস্তাব করে।

বাক্য গঠন

Type[]
Type<Type>
Type<Type[, Type]...>
Type<Type[|Type]...>

সংগ্রহের মানগুলি অন্য অ্যারে এমনকি অন্য সংগ্রহও হতে পারে।

Type<Type<Type>>
Type<Type<Type[, Type]...>>
Type<Type<Type[|Type]...>>

উদাহরণ

<?php

$x = [new Name()];
/* @var $x Name[] */

$y = new Collection([new Name()]);
/* @var $y Collection<Name> */

$a = new Collection(); 
$a[] = new Model_User(); 
$a->resetChanges(); 
$a[0]->name = "George"; 
$a->echoChanges();
/* @var $a Collection<Model_User> */

দ্রষ্টব্য: আপনি যদি কোনও আইডিই কোড সহায়তা করার প্রত্যাশা করেন তবে আইডিই পিএইচপিডোক জেনেরিক-স্টাইল সংগ্রহের স্বরলিপি সমর্থন করে কিনা সে সম্পর্কে এটি আরেকটি প্রশ্ন।

এই প্রশ্নের আমার উত্তর থেকে ।



11

আমি পরিষ্কার কোডটি পড়তে এবং লিখতে পছন্দ করি - যেমন রবার্ট সি মার্টিনের "ক্লিন কোড" তে বর্ণিত। তাঁর ক্রেডো অনুসরণ করার সময় আপনার অ্যারের (অভ্যন্তরীণ) কাঠামোটি জানতে আপনার বিকাশকারী (আপনার API এর ব্যবহারকারী হিসাবে) প্রয়োজন হবে না।

এপিআই ব্যবহারকারী জিজ্ঞাসা করতে পারেন: এটি কি কেবল মাত্র একটি মাত্রার একটি অ্যারে? বস্তুগুলি কি বহু মাত্রিক অ্যারের সমস্ত স্তরে ছড়িয়ে আছে? সমস্ত অবজেক্টে অ্যাক্সেস করার জন্য আমার কতটি নেস্টড লুপ (ফোরচ ইত্যাদি) দরকার? এই অ্যারেতে কোন ধরণের অবজেক্টগুলি "সঞ্চিত" থাকে?

আপনি যেমন উল্লেখ করেছেন আপনি সেই অ্যারেটিকে (যেগুলিতে বস্তু রয়েছে) একটি মাত্রিক অ্যারে হিসাবে ব্যবহার করতে চান।

নিশি দ্বারা বর্ণিত হিসাবে আপনি ব্যবহার করতে পারেন:

/**
 * @return SomeObj[]
 */

যে জন্য.

তবে আবার: সচেতন থাকুন - এটি কোনও স্ট্যান্ডার্ড ডকব্লক স্বরলিপি নয়। এই স্বরলিপিটি কিছু আইডিই প্রযোজক প্রবর্তন করেছিলেন।

ঠিক আছে, ঠিক আছে, একজন বিকাশকারী হিসাবে আপনি জানেন যে "[]" পিএইচপি-তে একটি অ্যারের সাথে আবদ্ধ। তবে সাধারণ পিএইচপি প্রসঙ্গে একটি "কিছুর []" অর্থ কী? "[]" এর অর্থ: "কিছু" এর মধ্যে নতুন উপাদান তৈরি করুন। নতুন উপাদান সবকিছু হতে পারে। তবে আপনি যা প্রকাশ করতে চান তা হ'ল: একই ধরণের এবং এটির সঠিক টাইপের সাথে অবজেক্টগুলির অ্যারে। আপনি দেখতে পাচ্ছেন, আইডিই প্রযোজক একটি নতুন প্রসঙ্গ উপস্থাপন করেছেন। আপনার একটি নতুন প্রসঙ্গ শিখতে হবে। একটি নতুন প্রসঙ্গ অন্যান্য পিএইচপি বিকাশকারীদের শিখতে হয়েছিল (আপনার ডকব্লকগুলি বুঝতে)। খারাপ শৈলী (!)।

কারণ আপনার অ্যারের একটি মাত্রা রয়েছে আপনি সম্ভবত সেই "অবজেক্টের অ্যারে" কে একটি "তালিকা" বলতে চান। সচেতন থাকুন যে অন্যান্য প্রোগ্রামিং ভাষায় "তালিকা" এর একটি বিশেষ অর্থ রয়েছে। উদাহরণস্বরূপ এটিকে "সংগ্রহ" বলা ভাল হবে utch

মনে রাখবেন: আপনি এমন একটি প্রোগ্রামিং ভাষা ব্যবহার করেন যা আপনাকে ওওপির সমস্ত বিকল্প সক্ষম করে। একটি অ্যারের পরিবর্তে একটি ক্লাস ব্যবহার করুন এবং আপনার শ্রেণিকে অ্যারের মতো ট্র্যাভারযোগ্যযোগ্য করে তুলুন। উদাহরণ:

class orderCollection implements ArrayIterator

বা যদি আপনি একটি বহুমাত্রিক অ্যারে / অবজেক্ট কাঠামোর মধ্যে বিভিন্ন স্তরে অভ্যন্তরীণ বস্তুগুলি সঞ্চয় করতে চান:

class orderCollection implements RecursiveArrayIterator

এই সমাধানটি "অর্ডার কালেকশন" টাইপের কোনও অবজেক্ট দ্বারা আপনার অ্যারে প্রতিস্থাপন করে, তবে এখনও পর্যন্ত আপনার আইডিই-র মধ্যে কোড সমাপ্তি সক্ষম করে না। ঠিক আছে. পরবর্তী পর্ব:

ডকব্লকস সহ ইন্টারফেসের মাধ্যমে প্রবর্তিত পদ্ধতিগুলি প্রয়োগ করুন - বিশেষত:

/**
 * [...]
 * @return Order
 */
orderCollection::current()

/**
 * [...]
 * @return integer E.g. database identifier of the order
 */
orderCollection::key()

/**
 * [...]
 * @return Order
 */
orderCollection::offsetGet()

টাইপ ইঙ্গিতটি ব্যবহার করতে ভুলবেন না:

orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)

এই সমাধানটি প্রচুর পরিচয় করিয়ে দেওয়া বন্ধ করে দেয়:

/** @var $key ... */
/** @var $value ... */

আপনার সমস্ত কোড ফাইল (যেমন লুপগুলির মধ্যে) জুড়ে, যেমন জাহেমাকা তার / তার উত্তরটির সাথে নিশ্চিত করেছেন। আপনার এপিআই ব্যবহারকারীর কোড সমাপ্তির জন্য সেই ডকব্লকগুলি প্রবর্তন করতে বাধ্য করা হবে না। কেবলমাত্র এক জায়গায় @ পুনর্বারণ করার ফলে অপ্রয়োজনীয় (@var) যতটা সম্ভব কমছে। "Var "এর সাথে" ডকব্লকগুলি "ছিটিয়ে দেওয়া আপনার কোডটিকে সবচেয়ে খারাপভাবে পঠনযোগ্য করে তুলবে।

ফাইনালি তুমি শেষ কষ্ট পেতে কষ্ট লাগছে? দেখে মনে হচ্ছে বাদাম ফাটাবার জন্য স্লেজহ্যামার নিচ্ছে? বাস্তবের নয়, যেহেতু আপনি সেই ইন্টারফেসের সাথে এবং পরিষ্কার কোডের সাথে পরিচিত। মনে রাখবেন: আপনার উত্স কোডটি একবার লেখা / অনেকগুলি পড়ে read

যদি আপনার আইডিই এর কোড সমাপ্তি এই পদ্ধতির সাথে কাজ না করে, তবে আরও ভাল একটিতে স্যুইচ করুন (যেমন ইন্টেলিজ আইডিইএ, পিএইচপিস্টর্ম, নেটবিয়ানস) বা আপনার আইডিই প্রযোজকের ইস্যু ট্র্যাকারটিতে একটি বৈশিষ্ট্য অনুরোধ ফাইল করুন।

আমার প্রশিক্ষক হওয়ার জন্য এবং আমাকে এ জাতীয় দুর্দান্ত জিনিস শেখানোর জন্য খ্রিস্টান ওয়েইসকে (জার্মানি থেকে) ধন্যবাদ জানাই। পিএস: জিং-এ আমার সাথে তার সাথে দেখা করুন।


এটি "সঠিক" উপায় মতো দেখায়, তবে আমি এটি নেটবিনের সাথে কাজ করতে পারি না। একটি সামান্য উদাহরণ তৈরি করেছেন: imgur.com/fJ9Qsro
fehrlich

2
সম্ভবত ২০১২ সালে এটি "একটি মান ছিল না", তবে এখন এটি পিএইচপিডকের বিল্ট-ইন কার্যকারিতা হিসাবে বর্ণনা করা হয়েছে।
উইরন

@ উইরন দেখে মনে হচ্ছে পিএইচপি ডকুমেন্টার এটিকে আদর্শ প্রযোজকদের প্রতিক্রিয়া হিসাবে এটির ম্যানুয়ালটিতে যুক্ত করেছে। আপনার কাছে যদি বিস্তৃত সরঞ্জাম সমর্থন করে তবে এর অর্থ এটি সর্বোত্তম অনুশীলন নয়। এটি SomeObj [] প্রায় আরও বেশি প্রকল্পে প্রায় ছড়িয়ে পড়তে শুরু করে, প্রয়োজনীয়গুলির মতো, প্রয়োজনীয়_অনসেস, অন্তর্ভুক্ত এবং অন্তর্ভুক্ত_বোনসগুলি বহু বছর আগে করা হয়েছিল। অটোলয়েডিংয়ের সাথে যে বিবৃতিগুলির উপস্থিতি 5% এর নিচে নেমে আসে। আশা করি সামোরবজ [] উপরের পদ্ধতির পক্ষে পরবর্তী 2 বছরের মধ্যে একই হারে নেমে আসবে।
ড্যানিয়েলাওয়ারাণী

1
আমি বুঝতে পারছি না কেন? এটি খুব সাধারণ এবং স্পষ্ট স্বরলিপি। আপনি যখন দেখেন SomeObj[]এটি একটি দ্বি-মাত্রিক অ্যারের SomeObjউদাহরণস্বরূপ এবং তারপরে আপনি কী করবেন তা আপনি জানেন। আমি মনে করি না এটি "ক্লিন কোড" ক্রেডিও অনুসরণ করে না।
Wirone

এই উত্তর হওয়া উচিত। সঙ্গে সব আইডিই সমর্থন পদ্ধতির @return <className>জন্য current()এবং সমস্ত বলছি যদিও। পিএইচপিস্টোরম সমর্থন করে তাই এটি আমাকে অনেক সাহায্য করেছিল। ধন্যবাদ বন্ধু!
পাভেল

5

ব্যবহার array[type]জেন্ড স্টুডিওতে ।

পার্সি-জাতির প্রাচীন শাস্ত্রগ্রন্থ স্টুডিও সালে array[MyClass]বা array[int]বা এমনকি array[array[MyClass]]কাজ মহান।


5

নেটবিন্স .0.০ এ (খুব কমও হতে পারে) আপনি রিটার্ন টাইপটিকে "টেক্সট অবজেক্টের সাথে অ্যারে" ঠিক @return Textতেমনভাবে ঘোষণা করতে পারেন এবং কোড হিন্টিং কাজ করবে:

সম্পাদনা করুন: @ باب ফ্যাঙ্গারের পরামর্শ সহ উদাহরণটি আপডেট করেছেন

/**
 * get all Tests
 *
 * @return Test|Array $tests
 */
public function getAllTexts(){
    return array(new Test(), new Test());
}

এবং কেবল এটি ব্যবহার করুন:

$tests =  $controller->getAllTests();
//$tests->         //codehinting works!
//$tests[0]->      //codehinting works!

foreach($tests as $text){
    //$test->      //codehinting works!
}

এটি নিখুঁত নয় তবে এটি কেবল "মিশ্র" রেখে দেওয়া ভাল, যা কোনও মূল্য দেয় না।

কনস হ'ল আপনাকে অ্যারেটিকে টেক্সট অবজেক্ট হিসাবে চালিত করার অনুমতি দেওয়া হবে যা ত্রুটি ছুঁড়ে দেবে।


1
আমি "@ পুনর্বার অ্যারে ব্যবহার করি | কিছু বিবরণ পরীক্ষা করুন"। যা একই আচরণকে ট্রিগার করে তবে এটি আরও খানিকটা ব্যাখ্যামূলক।
বব ফ্যাঙ্গার

1
এটি কোনও সমাধান নয়, সমাধান। আপনি এখানে যা বলছেন তা হ'ল "এই ফাংশনটি 'টেস্ট', বা একটি অ্যারে টাইপের কোনও বস্তু ফিরে আসতে পারে"। তবে এটি আপনাকে প্রযুক্তিগতভাবে অ্যারেতে কী থাকতে পারে সে সম্পর্কে কিছু জানায় না।
বাইসন

5

DanielaWaranie তার উত্তরে উল্লেখ করা হয়েছে - সেখানে $ আইটেমের প্রকার নির্দিষ্ট একটি উপায় যখন আপনি $ collectionObject মধ্যে $ আইটেম উপর iterating: যোগ @return MyEntitiesClassNameকরার current()এবং বাকি Iteratorএবং ArrayAccess-methods যা রিটার্ন মান।

পরিস্ফুটন! মধ্যে কোন প্রয়োজন নেই /** @var SomeObj[] $collectionObj */ধরে foreachথাকুন এবং সরাসরি সংগ্রহ বস্তুর সঙ্গে কাজ করে, নির্দিষ্ট পদ্ধতি সঙ্গে ফিরতি সংগ্রহ করার কোন প্রয়োজন হিসাবে বর্ণনা@return SomeObj[]

আমি সন্দেহ করি যে সমস্ত আইডিই এটি সমর্থন করে না তবে এটি পিএইচপিস্টোরমে পুরোপুরি সূক্ষ্মভাবে কাজ করে যা আমাকে আরও সুখী করে তোলে।

উদাহরণ:

class MyCollection implements Countable, Iterator, ArrayAccess {

    /**
     * @return User
     */
    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
}

আমি কি দরকারী এই উত্তর পোস্ট যুক্ত করতে যাচ্ছি

আমার ক্ষেত্রে current() এবং বাকী- interfaceপদ্ধতিগুলি বাস্তবায়িত হয়Abstract ক্লাসে এবং শেষ পর্যন্ত কী ধরণের সংস্থাগুলি সংগ্রহের জন্য সংরক্ষণ করা হবে তা আমি জানি না।

সুতরাং কৌশলটি এখানে: বিমূর্ত শ্রেণিতে রিটার্নের ধরণটি নির্দিষ্ট করবেন না, পরিবর্তে @methodনির্দিষ্ট সংগ্রহ শ্রেণীর বর্ণনায় পিএইচপিডোক ইনস্টশন ব্যবহার করুন ।

উদাহরণ:

class User {

    function printLogin() {
        echo $this->login;
    }

}

abstract class MyCollection implements Countable, Iterator, ArrayAccess {

    protected $items = [];

    public function current() {
        return $this->items[$this->cursor];
    }

    //... implement rest of the required `interface` methods and your custom
    //... abstract methods which will be shared among child-classes
}

/**
 * @method User current()
 * ...rest of methods (for ArrayAccess) if needed
 */
class UserCollection extends MyCollection {

    function add(User $user) {
        $this->items[] = $user;
    }

    // User collection specific methods...

}

এখন, ক্লাসের ব্যবহার:

$collection = new UserCollection();
$collection->add(new User(1));
$collection->add(new User(2));
$collection->add(new User(3));

foreach ($collection as $user) {
    // IDE should `recognize` method `printLogin()` here!
    $user->printLogin();
}

আবারও: আমি সন্দেহ করি যে সমস্ত আইডিই এটি সমর্থন করে না, তবে পিএইচপিস্টোরম তা করে। আপনার চেষ্টা করুন, ফলাফল মন্তব্য মন্তব্য!


এটিকে দূরে ঠেলে দেওয়ার জন্য ভাউচার, তবে দুর্ভাগ্যক্রমে আমি এখনও নিজেকে পুরানো জাভা জেনেরিক ধরণের প্রতিস্থাপনের জন্য বিশেষায়িত করার জন্য নিজেকে সমাধান করতে পারি .... ইয়াক '
সেবাস

ধন্যবাদ. আপনি কীভাবে কোনও স্থির পদ্ধতি টাইপ করতে পারেন?
ইয়েভেগেনি আফানসিয়েভ

3

আমি জানি আমি পার্টিতে দেরি করেছি, তবে আমি সম্প্রতি এই সমস্যাটিতে কাজ করছি। আমি আশা করি কেউ এটি দেখেছেন কারণ গৃহীত উত্তরটি যদিও সঠিক, তবে আপনি এটি করার সর্বোত্তম উপায় নয় । কমপক্ষে পিএইচপিএসটারমে নয়, আমি যদিও নেটবিন পরীক্ষা করিনি।

সেরা উপায় নেটিভ অ্যারে প্রকারের পরিবর্তে অ্যারেআইট্রেটর শ্রেণি প্রসারিত করা জড়িত। এটি আপনাকে উদাহরণ-স্তরের পরিবর্তে শ্রেণি-স্তরে ইঙ্গিতটি টাইপ করতে দেয়, এর অর্থ আপনাকে কেবল নিজের কোড জুড়েই নয় একবার পিএইচপিডোক করতে হবে (যা কেবল অগোছালো নয় এবং ডিআরওয়াই লঙ্ঘন করে না, তবে সমস্যাটিও হতে পারে রিফ্যাক্টরিং - পিএইচপিএসটর্মের রেফ্যাক্টরিং করার সময় পিএইচপিডোক মিস করার অভ্যাস রয়েছে)

নীচে কোড দেখুন:

class MyObj
{
    private $val;
    public function __construct($val) { $this->val = $val; }
    public function getter() { return $this->val; }
}

/**
 * @method MyObj current()
 */
class MyObjCollection extends ArrayIterator
{
    public function __construct(Array $array = [])
    {
        foreach($array as $object)
        {
            if(!is_a($object, MyObj::class))
            {
                throw new Exception('Invalid object passed to ' . __METHOD__ . ', expected type ' . MyObj::class);
            }
        }
        parent::__construct($array);
    }

    public function echoContents()
    {
        foreach($this as $key => $myObj)
        {
            echo $key . ': ' . $myObj->getter() . '<br>';
        }
    }
}

$myObjCollection = new MyObjCollection([
    new MyObj(1),
    new MyObj('foo'),
    new MyObj('blah'),
    new MyObj(23),
    new MyObj(array())
]);

$myObjCollection->echoContents();

এখানে কীটি হ'ল পিএইচপিডোকটি @method MyObj current()অ্যারেআইটেটর (যা mixed) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত রিটার্ন টাইপকে ওভাররাইড করে । এই পিএইচপিডোকের অন্তর্ভুক্তির অর্থ হ'ল আমরা যখন শ্রেণীর বৈশিষ্ট্যগুলি ব্যবহার করে পুনরাবৃত্তি foreach($this as $myObj)করি তখন ভেরিয়েবলের উল্লেখ করার সাথে সাথে আমরা কোড সমাপ্তি পাই$myObj->...

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

আমি এখানে অ্যারেআইটরেটর বাড়ানোর সম্পূর্ণ সমাধানটি দেখাইনি, সুতরাং আপনি যদি এই কৌশলটি ব্যবহার করেন তবে আপনি এটিও করতে চাইতে পারেন:

  • প্রয়োজন মতো অন্যান্য শ্রেণি-স্তরের PHPDoc অন্তর্ভুক্ত করুন methods offsetGet($index) এবং অন্যান্যnext()
  • স্যানিটি চেক সরান is_a($object, MyObj::class)কনস্ট্রাক্টর থেকে একটি ব্যক্তিগত পদ্ধতিতে
  • পদ্ধতির ওভাররাইড যেমন offsetSet($index, $newval)এবং থেকে এটি (এখন ব্যক্তিগত) স্যানিটি চেককে কল করুনappend($value)

খুব সুন্দর এবং পরিষ্কার সমাধান! :)
মার্কো Šতিজা

2

সমস্যাটি হ'ল কেবল @varএকটি একক প্রকারকে বোঝাতে পারে - এতে কোনও জটিল সূত্র নেই। আপনার যদি "ফু এর অ্যারে" এর জন্য একটি বাক্য গঠন থাকে তবে কেন সেখানে থামবেন এবং "অ্যারের অ্যারে, যার মধ্যে 2 ফু এবং তিনটি বার রয়েছে" এর জন্য একটি বাক্য গঠন যুক্ত করবেন না? আমি বুঝতে পারি যে উপাদানের একটি তালিকা সম্ভবত এর চেয়ে বেশি সাধারণ, তবে এটি পিচ্ছিল slাল।

ব্যক্তিগতভাবে, আমি @var Foo[]"ফু এর একটি অ্যারে" বোঝানোর জন্য কিছু সময় ব্যবহার করেছি , তবে এটি আইডিই দ্বারা সমর্থিত নয়।


5
আমি সি / সি ++ সম্পর্কে যে জিনিসগুলিকে পছন্দ করি তার মধ্যে একটি এটি আসলে এই স্তরটিতে প্রকারের ট্র্যাক রাখে। নীচে পিছলে যেতে খুব মনোরম opeাল হবে।
ব্রিল্যান্ড

2
Netbeans 7.2 (কমপক্ষে যে সংস্করণ আমি ব্যবহারের এ), কিন্তু একটু ajustment যথা সঙ্গে দ্বারা সমর্থিত হয়: /* @var $foo Foo[] */। এটি সম্পর্কে নিচে একটি উত্তর লিখেছি। এটি foreach(){}লুপগুলির অভ্যন্তরেও ব্যবহার করা যেতে পারে
হাইমাস্টডন

1
<?php foreach($this->models as /** @var Model_Object_WheelModel */ $model): ?>
    <?php
    // Type hinting now works:
    $model->getImage();
    ?>
<?php endforeach; ?>

5
কোন আইডিই এটি সমর্থন করে?
ফিলাফ্রেও

21
এটা খুব কুরুচিপূর্ণ। আপনি যখন এই জাতীয় প্রোগ্রামিং শুরু করেন তখন ক্লিন কোডকে বিদায় জানান।
হাফপাস্টফোর.কম

: বরং অ্যারের বিষয়বস্তু সংজ্ঞায়িত সঙ্গে আমার উত্তর তাকান stackoverflow.com/a/14110784/431967
Highmastdon

-5

আমি এমন কিছু পেয়েছি যা কাজ করছে, এটি জীবন বাঁচাতে পারে!

private $userList = array();
$userList = User::fetchAll(); // now $userList is an array of User objects
foreach ($userList as $user) {
   $user instanceof User;
   echo $user->getName();
}

11
কেবলমাত্র সমস্যাটি হ'ল মৃত্যুদন্ড কার্যকর করার জন্য অতিরিক্ত কোড প্রবর্তন করে, যা কেবলমাত্র আপনার আইডিই দ্বারা খাঁটিভাবে ব্যবহৃত হয়। পরিবর্তে মন্তব্যগুলির মধ্যে টাইপ ইঙ্গিতটি সংজ্ঞায়িত করা আরও ভাল।
বেন রোয়ে

1
বাহ এটি দুর্দান্ত কাজ করে। আপনি অতিরিক্ত কোড দিয়ে শেষ করবেন তবে এটি নিরীহ বলে মনে হচ্ছে। আমি কাজটি শুরু করতে যাচ্ছি: instance x উদাহরণস্বরূপ ওয়াই; // টাইফিন্ট
ইগোর নাদজ

3
আইডিইতে স্যুইচ করুন যা আপনাকে ডকব্লকস বা তদন্তের ভিত্তিতে কোডের সমাপ্তি দেয়। আপনি যদি নিজের আইডিই ফাইলটি স্যুইচ করতে না চান তবে আপনার আইডিই এর ইস্যু ট্র্যাকারটিতে একটি বৈশিষ্ট্য অনুরোধ রয়েছে।
ড্যানিয়েলাওয়ারাণী

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