কোনও ভেরিয়েবলকে একটি ডিফল্ট মান দেওয়ার সর্বোত্তম উপায় (পার্ল সিমুলেট করুন ||, || =)


134

আমি পার্লে এই ধরণের জিনিসটি করতে পছন্দ করি : খালি বা অপরিজ্ঞাত কিনা তা $foo = $bar || $bazনির্ধারণ $bazকরতে । এছাড়াও আপনি আছে যা শুধুমাত্র ধার্য হবে থেকে যদি সংজ্ঞায়িত বা ফাঁকা নয়।$foo$bar$foo ||= $bletch$bletch$foo$foo

এই পরিস্থিতিতে টেরিনারি অপারেটর ক্লান্তিকর এবং ক্লান্তিকর। অবশ্যই পিএইচপি-তে একটি সহজ, মার্জিত পদ্ধতি উপলব্ধ আছে?

বা একমাত্র উত্তরটি কোনও কাস্টম ফাংশন যা আইসেট ব্যবহার করে ()?



1
BTW পছন্দসই বৈশিষ্ট্য সহ পার্ল অপারেটার হয় //এবং //=তারা পার্ল v5.10.0 হিসাবে বিদ্যমান। যৌক্তিক মানের জন্য মূল ||এবং ||=পরীক্ষা, সংজ্ঞায়নের জন্য নয়।
প্লেকে

@ পলেক, ২৯ টি আপভোটের সাথে year বছরের পুরনো প্রশ্নটি কেন 6 টি উপভোক্তা (যা নিজেই অন্য প্রশ্নের নকল হিসাবে চিহ্নিত ছিল?) দিয়ে 1 বছরের পুরানো প্রশ্নের নকল হিসাবে চিহ্নিত হবে?) আমি মনে করি এটি রাখার বড় মূল্য রয়েছে? প্রশ্ন, শিরোনামটি আরও জেনেরিক (উত্তরটি উল্লেখ করে না যেমন: isset ())।
টম অ্যাগার

এগুলি পরিষ্কার এবং নির্ভুল নকল। এটি স্বীকার করে আমি কোনটি আসল হওয়া উচিত সে সম্পর্কে খুব বেশি ভাবি নি, আমি অন্য কোনও কিছুর মাঝে ছিলাম, দুজনের মধ্যে একটি লিঙ্ক তৈরি করা লক্ষ্য ছিল। আমার ভিটিসি প্রত্যাহার করা হচ্ছে।
প্যালেক

অপর এক প্রশ্নের সদৃশ হিসাবে একটি সঠিক ডুপ্লিকেট, হিসাবে চিহ্নিত (আইএমও ভুল): পিএইচপি isset জন্য সাধারণভাবে সংক্ষেপে ()?
পলেক

উত্তর:


130

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

$name = $_GET['name'] ?? 'john doe';

এটি সমান

$name = isset($_GET['name']) ? $_GET['name']:'john doe';

14
আমি যুক্তি দিয়েছি যে স্পেসশিপ অপারেটরেরও মেধা আছে।
মারিয়ানো

3
আমি ভেবেছিলাম মারিয়ানো আমাদের পা টানছে কিন্তু না, এটি একটি জিনিস <=>এবং বুট করার জন্য বেশ নির্ভুল!
এইচপিডাব্লুডি

1
নোট কোলেসিং অপারেটর শর্তসাপেক্ষ অপারেটর থেকে আলাদা আচরণ করে বলে মনে করে যে এটি কোনও nullমানের সাথে সুনির্দিষ্ট । উদাহরণস্বরূপ, যদি $_GET['name']একটি খালি স্ট্রিংতে সেট করা থাকে, প্রথম লাইনটি একটি খালি স্ট্রিংটি ফিরিয়ে আনবে, তবে আমরা ব্যবহার করে "জন ডো" ফিরিয়ে দিতে পারি $_GET['name'] ? $_GET['name'] : 'john doe'
ভিফ্যান্টম

211

পিএইচপি 5.3 এর একটি শর্টহ্যান্ড ?:অপারেটর রয়েছে:

$foo = $bar ?: $baz;

কোনটি নির্ধারণ করে $barযদি এটি কোনও শূন্য মান না হয় (পার্লের থেকে পিএইচপিতে এটি কীভাবে আলাদা হবে তা আমি জানি না), অন্যথায় $baz, এবং পার্ল এবং পিএইচপি-র পুরানো সংস্করণগুলিতে এটি একই রকম:

$foo = $bar ? $bar : $baz;

তবে পিএইচপি-র জন্য এটির জন্য যৌগিক অ্যাসাইনমেন্ট অপারেটর নেই (এটি পার্লের সমতুল্য নয় ||=)।

এছাড়াও, পিএইচপি $barযদি আপনি বিজ্ঞপ্তিগুলি বন্ধ না করে সেট না করে থাকে তবে শব্দ করবে । এছাড়া এর মধ্যে একটি শব্দার্থিক পার্থক্য নেই isset()এবং empty()। পূর্বেরটি ভেরিয়েবলটি উপস্থিত না থাকলে বা সেট করা থাকলে মিথ্যা ফেরত দেয় NULL। আধুনিক সত্য 'ফেরত পাঠায় এটি বিদ্যমান না করে, তাহলে বা সেট করা হয় 0, '', falseবা NULL


2
+1 আমাকে 5.3 এর আর একটি দুর্দান্ত বৈশিষ্ট্যটির সাথে পরিচয় করানোর জন্য আমি আমার আরএইচইল 5 / পিএইচপি 5.1.2 সার্ভারগুলিতে মিস করছি।
মাইকেল বারকোভস্কি

আমি অনুমান করি আপনার পেনাল্টিমেট বাক্যটির The first returnsপরিবর্তে আপনি বলতে চাইছেন The second
টোটো

21
মনে রাখবেন যে আপনার পরিবর্তনশীল যদি অপরিজ্ঞাত হয় তবে পিএইচপি এটি সম্পর্কে বিজ্ঞপ্তি দেবে। এটি, দুর্ভাগ্যক্রমে, $var = isset($var) ? $var : 'default value'; এটির কোনও প্রতিস্থাপন নয় এটি উত্তরে বলেছে যে ... যে কেউ এটিকে স্কিম করে তা কেবল আবার এটি নির্দেশ করে। :-D
ব্র্যাড

6
$ Var = @ $ var করা কি খারাপ?: 'ডিফল্ট মান'; যদি তাই হয় তবে কেন? প্রদত্ত যে শুধুমাত্র "ত্রুটি" হতে পারে যে ভার সেট করা হয়নি এবং আমাদের যদি set
ভ্যার

8

সব মহান উত্তরের জন্য ধন্যবাদ!

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

function set_if_defined(&$var, $test){
    if (isset($test)){
        $var = $test;
        return true;
    } else {
        return false;
    }
}

function set_unless_defined(&$var, $default_var){
    if (! isset($var)){
        $var = $default_var;
        return true;
    } else {
        return false;
    }
}

function select_defined(){
    $l = func_num_args();
    $a = func_get_args();
    for ($i=0; $i<$l; $i++){
        if ($a[$i]) return $a[$i];
    }
}

উদাহরণ:

// $foo ||= $bar;
set_unless_defined($foo, $bar);

//$foo = $baz || $bletch
$foo = select_defined($baz, $bletch);

আমি নিশ্চিত যে এগুলি আরও উন্নত করা যেতে পারে।


7

পুরানো পিএইচপি সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ থাকার একটি সাধারণ প্রতিমাটি হ'ল:

 $var = $bool   or   $var = "default";
 // If I use it, then only with excessive spaces for clarity.

এটি বুুলিয়ান প্রসঙ্গে মূল্যায়িত করা যায় এমন মানগুলির জন্য কাজ করে। এখানে সুবিধাটি হ'ল এটি আপনাকে বলেছিল যে ডিবাগ ই_নোটাইসটি ভেরিয়েবলটি অপরিজ্ঞাত করা উচিত।


সংজ্ঞায়িত না $bool ? $bool : "default"হলে কি কোনও নোটিশ নির্গত $boolহয় না?
বোল্টক্লক

অবশ্যই, এটি একই। আমি ধরে নিয়েছি ওপি উল্লেখ করছে isset($var) ? $var : DEFAULT। তবে শোনাচ্ছে যে সে যাইহোক সেগুলি এড়িয়ে চলতে চায়।
মারিও

6

পিএইচপি-তে 7.. এরও বেশি আগে, কোনওটি ব্যবহার করতে পারে?: একটি সংজ্ঞায়িত ভেরিয়েবলের জন্য স্থানীয়ভাবে ত্রুটিযুক্ত একটি দিয়ে এটি দমন করা উচিত @:

$foo = @$bar ?: $baz;

0

এটি issetমামলার আর একটি ভাল ফর্ম্যাট

isset($foo) || $foo= $bar;

অন্য একটি সহজ উপায় এবং আপনাকে আরও নিয়ন্ত্রণ প্রদান করবে কারণ আপনি আরও শর্ত যুক্ত করতে পারেন এবং একই সময়ে অন্য ভেরিয়েবলকে বরাদ্দ করতে পারেন

$foo = (isset($oData['foo']))?$bar['foo']:'default value';


0

একটি সম্ভাব্য সমাধান: ডিফল্টরূপে ()

আমাদের যদি কোনও কারখানার সমাধান না হয় (যা প্রকৃতপক্ষে খুব বিরক্তিকর) তবে আমি নীচের ছোট সহায়কটির প্রস্তাব দেব। এটি বেশিরভাগ ক্ষেত্রে কাজটি করে:


    function defaultFor(&$x,$default=null) {
        if(!isset($x)) $x = $default;
    }

    //--------------------  Now you can do this: --------------

    defaultFor($a,"Jack");  // if $a is not set, it will be "Jack"
    defaultFor($x);         // no more notices for $x but keep it !isset

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

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