লেখার প্রসঙ্গে পদ্ধতির রিটার্ন মান ব্যবহার করতে পারবেন না


465

আমি মনে করি যে নিম্নলিখিত কোডের কাজ করা উচিত, তবে এটি কার্যকর হয় না (সম্পাদিত: এখন পিএইচপি 5.5+ এ কাজ করে) :

if (!empty($r->getError()))

যেখানে getError()সহজভাবে:

public function getError()
{
    return $this->error;
}

তবুও আমি এই ত্রুটিটি শেষ করছি:

লেখার প্রসঙ্গে পদ্ধতির রিটার্ন মান ব্যবহার করতে পারে না

এটার মানে কি? এটি কি শুধু পঠিত নয়?


2
সম্ভবত পিএইচপি 5.5- এ আপনাকে এই মত প্রকাশের অনুমতি দেওয়া হবে empty: wiki.php.net/rfc/empty_isset_exprs
কার্লোস ক্যাম্পাদ্রেস


ঠিক আছে, আমি আমার কোডটিও খুব সঠিকভাবে খুঁজে পেয়েছিif ( !$e->find('div') ) যা এইচটিএমএল এইচটিএমএল ডিওএম উপাদান খালি আছে কিনা তা যাচাই করে। আমি এর অভ্যন্তরীণ ডিভ ছাড়াই কেবল একক ডিভ মুদ্রণ করতে লুপের অভ্যন্তরে এটি ব্যবহার করি।
সালেম

উত্তর:


769

empty() রেফারেন্সের মাধ্যমে মানটি অ্যাক্সেস করতে হবে (সেই রেফারেন্সটি উপস্থিত থাকা কিছুর দিকে নির্দেশ করে কিনা তা পরীক্ষা করার জন্য) এবং 5.5 এর আগে পিএইচপি ফাংশন থেকে ফিরে আসা অস্থায়ী মানগুলির রেফারেন্সকে সমর্থন করে না।

তবে, আপনার আসল সমস্যাটি হ'ল আপনি একেবারেই ব্যবহার করুন empty(), ভুল করে বিশ্বাস করে যে "খালি" মানটি "মিথ্যা" থেকে আলাদা any

খালি কেবল একটি উপনাম !isset($thing) || !$thing। আপনি যে জিনিসটি যাচাই করছেন তা সর্বদা উপস্থিত থাকে (ফাংশন কলগুলির পিএইচপি ফলাফলগুলিতে সর্বদা উপস্থিত থাকে), empty()ফাংশনটি একটি প্রত্যাখ্যান অপারেটর ছাড়া কিছুই নয়

পিএইচপি শূন্যতার ধারণা নেই । যে মানগুলি মিথ্যাতে মূল্যায়ন করে সেগুলি খালি, মানগুলি যা সত্য বলে মূল্যায়ন করে তা খালি নয়। ইহা একই জিনিস. এই কোড:

$x = something();
if (empty($x)) 

এবং এই:

$x = something();
if (!$x) 

করেছে সবসময় একই ফল, সব ক্ষেত্রেই, সমস্ত datatypes জন্য (কারণ $xসংজ্ঞায়িত করা হয় empty()অপ্রয়োজনীয়)।

পদ্ধতি থেকে রিটার্ন মান সর্বদা উপস্থিত থাকে (আপনার returnবিবৃতি না থাকলেও, ফেরতের মান বিদ্যমান এবং এতে থাকে null)। অতএব:

if (!empty($r->getError()))

যৌক্তিকভাবে এর সমতুল্য:

if ($r->getError())

29
এটি বর্তমানে নির্বাচিতটির চেয়ে অনেক বেশি ভাল উত্তর।
সিস্টেমপ্যাডাক্স

20
@ জিসিবি: না, পিএইচপি ম্যানুয়াল স্পষ্টভাবে বলেছে এটি অভিন্ন: "খালি () এর বিপরীত (boolean) var, যদি পরিবর্তনশীল সেট না করা হয় তখন কোনও সতর্কতা উত্পন্ন হয় না" "
কর্নেল

16
একটি সতর্কতা অংশ তৈরি না করা বেশ গুরুত্বপূর্ণ ... খালি ($ var) সত্য হবে যদি এটি 0, '', অ্যারে (), NULL, বা এমনকি সংজ্ঞায়িত না হয়। এটি একটি ভাল অনুশীলন, বিশেষত যাতে আপনি ফাইলগুলি পূরণ না করেই আপনার আসল সতর্কতাগুলিতে লগ করতে পারেন
15-15

3
ঠিক আছে, দুর্দান্ত উত্তর, তবে এটি এড়ানোর সঠিক উপায় কী, কেউ কি জানেন?
জাভাটার

3
সাধারণভাবে @EugenMihailescu ঠিক আছে, কিন্তু এটা খালি করতে সমতুল্য () কঠোরভাবে না কারণ "", 0ইত্যাদি "খালি" আছে, কিন্তু না নাল।
কর্নেল

330

দ্রষ্টব্য: এটি একটি উচ্চ দৃশ্যমানতার সহিত একটি খুব বেশি ভোট দেওয়া উত্তর, তবে দয়া করে নোট করুন যে এটি খারাপ, অপ্রয়োজনীয় কোডিং অনুশীলনকে প্রচার করে! সঠিক উপায়ের জন্য @ কর্নেলের উত্তর দেখুন ।

দ্রষ্টব্য # 2: আমি @ কর্নেলের উত্তরটি ব্যবহার করতে পরামর্শগুলি সমর্থন করি । আমি যখন এই উত্তরটি তিন বছর আগে লিখেছি তখন আমি কেবল ত্রুটির প্রকৃতিটি বোঝাতে চেয়েছিলাম, বিকল্পটি সমর্থন করার প্রয়োজন নেই orse নীচে কোড স্নিপেট সুপারিশ করা হয় না।


এটি 5.5 এর নীচে পিএইচপি সংস্করণগুলিতে খালি () এর সীমাবদ্ধতা ।

দ্রষ্টব্য: খালি () কেবলমাত্র অন্য কিছু হিসাবে ভেরিয়েবলগুলি পরীক্ষা করে ফলে পার্স ত্রুটি ঘটবে। অন্য কথায়, নিম্নলিখিতটি কাজ করবে না: খালি (ট্রিম ($ নাম))।

আপনাকে এটিতে পরিবর্তন করতে হবে

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
এটি অত্যন্ত উত্সাহজনক।
ডেভিড মুরডোক

47
দ্রষ্টব্য: একই সাথে সত্য isset()। অর্থাত: isset($this->foo->getBar())একই ইস্যুতে ফলাফল হবে।
ক্যাচডেভ

7
পর্নেল এর উত্তর আরও বিশদ সহ আরও ভাল সমাধান সহ এটি ব্যাখ্যা করেছে
সিস্টেমপ্যাডাক্স

5
@ সিস্টেমেপারাডক্স - "আরও ভাল" দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে। "ক্লিনার" সমাধানের সাথে পর্নেলের উত্তরটি তর্কযোগ্যভাবে আরও পুঙ্খানুপুঙ্খভাবে রয়েছে তবে ত্রুটিটির উত্সও আসলে ব্যাখ্যা করে না।
পিটার বেইলি

4
কারণ এটি ভুল নয়, @ অনুধাবন করুন। এটি সেরা উত্তর নয়, আপনি আমার কাছ থেকে কোনও যুক্তি পাবেন না। এমনকি আমি নিজেও পোর্নেলকে ভোট দিয়েছি। এটি খুব পুরানো উত্তর তবে এটি ভুল নয় । উচ্চ ভোটের বিষয়ে: মনে রাখবেন, পোর্নেল এর প্রায় 17 মাস পরে এসেছিল।
পিটার বেইলি

37

পিএইচপি ডক্স অনুসারে :

খালি () কেবল অন্য কিছু হিসাবে ভেরিয়েবলগুলি পরীক্ষা করে ফলে পার্স ত্রুটির ফলস্বরূপ

আপনি empty()কোনও ফাংশনের রিটার্ন মানটিতে সরাসরি ব্যবহার করতে পারবেন না । পরিবর্তে, getError()পরিবর্তনটি থেকে পরিবর্তনটিকে সেট করুন এবং ভেরিয়েবলটি চালান empty()


19

আমি সাধারণত এই ইস্যুটি ঘুরে দেখার জন্য is_empty () নামে একটি বিশ্বব্যাপী ফাংশন তৈরি করি

function is_empty($var)
{ 
 return empty($var);
}

তারপরে যে কোনও জায়গায় আমি সাধারণত খালি ব্যবহার করতাম () আমি কেবলমাত্র_ইম্পটি () ব্যবহার করি


2
এটি না করা এবং মানদণ্ডগুলিতে অটল থাকা ভাল (তারা যতটা বিরক্তিকর হতে পারে)।
টনিহাব

1
@ অভিনবতা আপনি ব্যাখ্যা করতে পারেন কেন না?
জ্যানিস ভেনবার্গস

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

14
বাহ, আপনি সবেমাত্র একটি প্রত্যাখ্যান ফাংশন আবিষ্কার করেছেন । আপনি জানেন পিএইচপি এর !জন্য অপারেটর আছে ? :)
কর্নেল

4

অন্যদের দ্বারা নির্দেশিত হিসাবে, এটি খালি () এর (অদ্ভুত) সীমাবদ্ধতা।

বেশিরভাগ রক্তবর্ণের জন্য, এটি করা খালি কল করার সমান, তবে এটি কাজ করে:

if ($r->getError() != '')

5
এটি সত্য নয় - empty()কেবল একটি ফাঁকা স্ট্রিংয়ের চেয়ে আরও অনেকগুলি সম্ভাবনা কভার করে
রবি অ্যাভারিল

3
সে কারণেই এটি " বেশিরভাগ উদ্দেশ্যে " বলে, সকলকে নয়
জনি হার্টিকাইনেইন

2

সমস্যাটি এটি, আপনি জানতে চান ত্রুটিটি খালি নয়।

public function getError() {
    return $this->error;
}

একটি পদ্ধতি যুক্ত করা হয়েছে এররসেট () সমস্যার সমাধান করবে।

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

এখন এটি কোনও বিজ্ঞপ্তি ছাড়াই এই কোডটি দিয়ে কাজ করবে।

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

অ্যারেটি খালি আছে কিনা তা পরীক্ষা করার বিকল্প উপায় হ'ল:

count($array)>0

এটি আমার জন্য ত্রুটি ছাড়াই কাজ করে

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