কীভাবে ইসসেট () এবং খালি () এড়ানো যায়


98

আমার বেশ কয়েকটি পুরানো অ্যাপ্লিকেশন রয়েছে যা E_NOTICE ত্রুটি স্তরে চলাকালীন প্রচুর "xyz অপরিজ্ঞাত" এবং "অপরিজ্ঞাত অফসেট" বার্তা ফেলে দেয় কারণ ভেরিয়েবলগুলির অস্তিত্ব স্পষ্টভাবে চেক করা হয় না ব্যবহার করে isset()এবং একত্রিত করে।

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

যাইহোক, আমার কোডটিতে শত isset() empty()এবং array_key_exists()s কে কী প্রভাবিত করে তা আমি পছন্দ করি না । এটি স্ফীত হয়ে যায়, কম পঠনযোগ্য হয়ে ওঠে, মান বা অর্থের দিক থেকে কোনও লাভ না করে।

E_NOTICE সামঞ্জস্যপূর্ণ থাকা অবস্থায় আমি কীভাবে অতিরিক্ত কোডের ছাড়াই আমার কোডটি গঠন করতে পারি?


6
আমি পুরোপুরি একমত. এজন্য আমি জেন্ডার ফ্রেমওয়ার্কটি এত পছন্দ করি, অনুরোধের মডিউলটি সেখানে খুব ভাল। যদি আমি কিছু ছোট অ্যাপ্লিকেশনটিতে কাজ করি তবে আমি সাধারণত যাদু পদ্ধতিগুলির সাথে কিছু সহজ অনুরোধ শ্রেণি কোড দিয়ে থাকি __set এবং __get যা জেডএফের অনুরোধের অনুরূপ কাজ করে। এইভাবে আমি আমার কোডে আইসেটের সমস্ত উপস্থিতি এবং খালি এড়াতে চাই। এইভাবে আপনাকে যেভাবে ব্যবহার করতে হবে তা হ'ল (গণনা ($ আরআর)> 0) এগুলিগুলি পুনরাবৃত্তি করার আগে এবং যদি কিছু জটিল জায়গায় (নাল! == $ পরিবর্তনশীল) হয়। দেখতে অনেকটা ক্লিনার লাগছে।
রিচার্ড নপ

উত্তর:


128

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


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

এই সতর্কতাগুলি আপনাকে সাহায্য করার জন্য , আপনাকে বিরক্ত করার জন্য নয়। যদি আপনি একটি সতর্কতা পান তবে "আপনি এমন কিছু নিয়ে কাজ করার চেষ্টা করছেন যা বিদ্যমান নেই!" , আপনার প্রতিক্রিয়া হওয়া উচিত "ওফস, আমার খারাপ, আমাকে সেই ASAP ঠিক করতে দিন"। আপনি কীভাবে "ভেরিয়েবলগুলি কেবলমাত্র সূক্ষ্ম অপরিজ্ঞাত কাজ করে" এবং সত্যতার সাথে ভুল কোডের মধ্যে পার্থক্য বলতে যা গুরুতর ত্রুটি হতে পারে ? এই কারণেই আপনি সর্বদা, সর্বদা , ত্রুটি প্রতিবেদনটি 11 এ পরিণত হওয়ার সাথে বিকাশ করেন এবং একক না হওয়া পর্যন্ত আপনার কোডে প্লাগিং চালিয়ে যান reasonNOTICEজারি করা হয়. ত্রুটি প্রতিবেদন বন্ধ করে দেওয়া কেবলমাত্র উত্পাদন পরিবেশের জন্য, তথ্য ফাঁস এড়াতে এবং বগি কোডের মুখেও আরও ভাল ব্যবহারকারীর অভিজ্ঞতা সরবরাহ করার জন্য।


সম্প্রসারিত:

আপনার কোডটি সর্বদা আপনার প্রয়োজন হবে না issetবা emptyকোথাও কোথাও, তাদের উপস্থিতি হ্রাস করার একমাত্র উপায় হ'ল আপনার ভেরিয়েবলগুলি সঠিকভাবে আরম্ভ করা। পরিস্থিতির উপর নির্ভর করে এটি করার বিভিন্ন উপায় রয়েছে:

ফাংশন যুক্তি:

function foo ($bar, $baz = null) { ... }

কিনা তা যাচাই করতে দরকার নেই $barবা $bazফাংশন ভিতরে নির্ধারণ করা হয় কারণ আপনার শুধু তাদের সেট, সব আপনি চিন্তা করতে হবে সম্পর্কে যদি তাদের মান মূল্যায়ন হয় trueবা false(অথবা যাই হোক না কেন অন্য)।

নিয়মিত ভেরিয়েবলগুলি যে কোনও জায়গায়:

$foo = null;
$bar = $baz = 'default value';

আপনার ভেরিয়েবলগুলি কোডের একটি ব্লকের শীর্ষে চালু করুন যাতে আপনি সেগুলি ব্যবহার করতে চলেছেন। এটি সমস্যার সমাধান !issetকরে, আপনার ভেরিয়েবলের সর্বদা একটি পরিচিত ডিফল্ট মান থাকে তা নিশ্চিত করে, নিম্নলিখিত কোডটি কী কাজ করবে তা পাঠককে ধারণা দেয় এবং এর ফলে স্বতন্ত্র-ডকুমেন্টেশনের জন্যও কাজ করে।

অ্যারে:

$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);

উপরের মত একই জিনিসটি, আপনি ডিফল্ট মানগুলির সাথে অ্যারের সূচনা করছেন এবং তাদেরকে সত্যিকারের মান দিয়ে ওভাররাইট করছেন।

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

<table>
    <?php if (!empty($foo) && is_array($foo)) : ?>
        <?php foreach ($foo as $bar) : ?>
            <tr>...</tr>
        <?php endforeach; ?>
    <?php else : ?>
        <tr><td>No Foo!</td></tr>
    <?php endif; ?>
</table>

আপনি যদি নিজেকে নিয়মিত ব্যবহার করে দেখতে পান তবে আপনি এটি array_key_existsকী ব্যবহার করছেন তা মূল্যায়ন করা উচিত। কেবলমাত্র একবারে এখানে পার্থক্য রয়েছে:

$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true

যদিও উপরে উল্লিখিত হয়েছে, আপনি যদি সঠিকভাবে আপনার ভেরিয়েবলগুলি আরম্ভ করছেন, আপনার কীটি উপস্থিত আছে কিনা তা খতিয়ে দেখার দরকার নেই, কারণ আপনি জানেন যে এটি রয়েছে। যদি আপনি একটি বাহ্যিক উত্স থেকে অ্যারের পেয়ে থাকেন, মান সম্ভবত হবে না nullকিন্তু '', 0, '0', falseঅথবা এটি ভালো কিছু, অর্থাত্ একটি মান আপনার সাথে মূল্যায়ন করতে পারেন issetবা emptyআপনার অভিপ্রায় উপর নির্ভর করে। আপনি যদি নিয়মিতভাবে একটি অ্যারে কী সেট করে থাকেন nullএবং এটির অর্থ বোঝাতে চান তবে false, উদাহরণস্বরূপ যদি উপরের উদাহরণে পৃথক ফলাফলের ফলাফল issetএবং array_key_existsআপনার প্রোগ্রামের যুক্তিতে কোনও পার্থক্য তৈরি হয় তবে আপনাকে নিজের কারণ জিজ্ঞাসা করা উচিত। ভেরিয়েবলের নিছক অস্তিত্ব গুরুত্বপূর্ণ হওয়া উচিত নয়, কেবল তার মানটিই ফলস্বরূপ হওয়া উচিত। কীটি যদি একটি true/ falseপতাকা হয়, তবে ব্যবহার করুনtrueবা false, না null। এটির ব্যতিক্রম কেবলমাত্র তৃতীয় পক্ষের লাইব্রেরি হবে যা nullকিছু বোঝাতে চায় তবে nullপিএইচপি-তে সনাক্ত করা এত কঠিন যে আমি এখনও এটি করে এমন কোনও লাইব্রেরি খুঁজে পাইনি।


4
সত্য, তবে বেশিরভাগ ব্যর্থ অ্যাক্সেসের প্রচেষ্টা এর if ($array["xyz"])পরিবর্তে isset()বা array_key_exists()যা আমি কিছুটা বৈধ বলে মনে করি, অবশ্যই কাঠামোগত সমস্যা নয় (আমাকে ভুল হয়ে থাকলে আমাকে সংশোধন করুন)। যুক্ত array_key_exists()করা আমার কাছে ভয়ঙ্কর বর্জ্যের মতো দেখাচ্ছে।
পেক্কা 6

9
আমি এমন কোনও ক্ষেত্রে ভাবতে পারি না যেখানে আমি array_key_existsসাধারণ isset($array['key'])বা এর পরিবর্তে ব্যবহার করব !empty($array['key'])। অবশ্যই, উভয়ই আপনার কোডে 7 বা 8 টি অক্ষর যুক্ত করে, তবে আমি খুব কমই এটিকে একটি সমস্যা বলব। এটি আপনার কোড পরিষ্কার করতে সহায়তা করে: এর if (isset($array['key']))অর্থ এই পরিবর্তনশীলটি আসলেই indeedচ্ছিক এবং অনুপস্থিত থাকতে পারে, যেখানে if ($array['key'])কেবল "যদি সত্য হয়" এর অর্থ। যদি আপনি পরবর্তীটির জন্য কোনও বিজ্ঞপ্তি পান তবে আপনি জানেন যে আপনার যুক্তিটি কোথাও কোথাও খারাপ।
প্রতারণা করুন

6
আমি বিশ্বাস করি যে আইসেট () এবং অ্যারে_কি_এক্সিস্টস () এর মধ্যে পার্থক্যটি হল মানটি যদি ন্যূনাল হয় তবে উত্তরটি সত্য হবে। isset () না।
Htbaa

4
সত্য, তবে আমি একটি বুদ্ধিমান ব্যবহারের ক্ষেত্রে ভাবতে পারি নি যেখানে আমাকে অস্তিত্বহীন চলক এবং একটি সেট কী যার মান নালার মধ্যে পার্থক্য করতে হবে। মানটি যদি FALSE এর মূল্যায়ন করে তবে পার্থক্যটি কোনও পার্থক্য ছাড়াই হওয়া উচিত। :)
ডিজেজ

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

37

শুধু এটির জন্য একটি ফাংশন লিখুন। কিছুটা এইরকম:

function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

যা আপনি হিসাবে ব্যবহার করতে পারেন

$username = get_string($_POST, 'username');

মত তুচ্ছ কাপড় জন্য একই কাজ করবেন get_number(), get_boolean(), get_array()এবং তাই।


5
এটি দুর্দান্ত দেখায় এবং ম্যাজিক_উইটগুলি পাশাপাশি পরীক্ষা করে। চমৎকার!
পেক্কা 6

দুর্দান্ত ফাংশন! ধন্যবাদ ভাগ করে নেওয়ার জন্য অনেক।
মাইক মুর

4
লক্ষ্য করুন যে $ _POST ['কিছু'] অ্যারে ফিরে আসতে পারে, উদাহরণস্বরূপ ইনপুট <input name="something[]" />। এটি উপরের কোডটি ব্যবহার করে ত্রুটির কারণ (অ্যারেগুলিতে ট্রিম প্রয়োগ করা যাবে না) হতে পারে, এক্ষেত্রে কারও ব্যবহার করা উচিত is_stringএবং সম্ভবত strval। এটি কেবল এমন কোনও ঘটনা নয় যেখানে get_arrayব্যবহারকারীর ইনপুট (দূষিত) হতে পারে যেহেতু কারওর ব্যবহার করা উচিত এবং ব্যবহারকারী ইনপুট পার্সারটিকে কোনওভাবেই ত্রুটি ছুঁড়ে ফেলা উচিত নয়।
সিয়ানটিক

4
আমি একই ধরণের ফাংশন ব্যবহার করি তবে সংজ্ঞায়িত: ফাংশন get_value (& $ আইটেম, $ ডিফল্ট = NULL) {রিটার্ন আইসেট ($ আইটেম)? $ আইটেম: $ ডিফল্ট; Function এই ফাংশনটির সুবিধা হ'ল আপনি এটিকে অ্যারে, ভেরিয়েবল এবং অবজেক্টের সাথে কল করতে পারেন। ত্রুটিটি হ'ল $ আইটেমটি পরে না হয়ে থাকলে (নাল থেকে) শুরু হয়।
মাদুর

আপনার 1 টি কার্যক্রমে তাদের সাথে ডিল করার পরিবর্তে বিশ্বব্যাপী যাদু উদ্ধৃতিগুলি বন্ধ করা উচিত। ইন্টারনেটে প্রচুর উত্স রয়েছে যাদু উদ্ধৃতিগুলি ব্যাখ্যা করে।
কায়লা

13

আমি বিশ্বাস করি যে এই সমস্যার সাথে মোকাবিলা করার অন্যতম সেরা উপায় হ'ল একটি ক্লাসের মাধ্যমে জিইটি এবং পোষ্টের (কুকি, সেশন ইত্যাদি) এর মানগুলি অ্যাক্সেস করা।

এই অ্যারেগুলির প্রত্যেকটির জন্য একটি ক্লাস তৈরি করুন এবং ঘোষণা করুন __getএবং __setপদ্ধতিগুলি ( ওভারলোডিং )। __getএকটি যুক্তি গ্রহণ করে যা মানটির নাম হবে। এই পদ্ধতিটি সম্পর্কিত গ্লোবাল অ্যারেতে এই মানটি যাচাই করা উচিত, হয় তা ব্যবহার করে isset()বা empty()এটি উপস্থিত থাকলে বা null(বা অন্য কোনও ডিফল্ট মান) অন্যথায় মানটি ফিরিয়ে আনতে হবে ।

এর পরে আপনি আত্মবিশ্বাসের সাথে এই পদ্ধতিতে অ্যারে মানগুলি অ্যাক্সেস করতে পারেন: $POST->usernameএবং কোনও isset()এস বা empty()এস ব্যবহার না করে প্রয়োজনে যে কোনও বৈধতা যাচাই করে নিন । তাহলে usernameসংশ্লিষ্ট বিশ্বব্যাপী অ্যারের মধ্যে বিদ্যমান নেই তারপর null, ফেরত পাঠানো হবে তাই কোনও সতর্কবার্তা বা নোটিশ তৈরি করা হবে।


4
এটি একটি দুর্দান্ত ধারণা এবং এমন কিছু যা আমি কোডের পুনর্গঠন করতে প্রস্তুত। +1
15-10 এ পেক্কা

দুর্ভাগ্যক্রমে আপনি inst _GET বা $ _POST এ নিযুক্ত না করা অবধি এই দৃষ্টান্তগুলিকে সুপারগ্লোবাল করতে সক্ষম হবেন না যা বেশ কুৎসিত হবে। তবে আপনি অবশ্যই স্ট্যাটিক ক্লাস ব্যবহার করতে পারেন ...
থিফমাস্টার

4
আপনি "স্ট্যাটিক ক্লাস" এ গেটর এবং সেটটার ব্যবহার করতে পারবেন না। এবং ভেরিয়েবল প্রতি এক শ্রেণি লেখা খারাপ অনুশীলন কারণ এটি কোড সদৃশ বোঝায় যা খারাপ। আমি মনে করি না এই সমাধানটি সর্বাধিক পর্যাপ্ত।
মাদুর

শ্রেণীর পাবলিক স্ট্যাটিক সদস্য সুপারগ্লোবাল, যেমন: HTTP :: O পোষ্ট-> ব্যবহারকারীর নাম হিসাবে কাজ করে, যেখানে আপনি HTTP :: $ পোষ্টটি ব্যবহারের আগে এক পর্যায়ে ইনস্ট্যান্ট করেন, অর্থাৎ। শ্রেণি HTTP {পাবলিক স্ট্যাটিক $ POST = অ্যারে (); ...}; এইচটিটিপি :: $ পোস্ট = নতুন কিছু ক্লাস ($ _ পোস্ট); ...
ভেলক্রো

6

array_key_exists()ফাংশনটি ব্যবহার করতে আমার আপত্তি নেই । আসলে, আমি ব্যবহার পছন্দ এই নির্দিষ্ট ফাংশন বদলে ওপর নির্ভর হ্যাক ফাংশন যা ভবিষ্যতে তাদের আচরণ পরিবর্তন করতে পারে মত emptyএবংisset (এড়াতে strikedthrough susceptibilities )।


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

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

ধরা যাক আপনি নিম্নলিখিত অ্যারেগুলি করেছেন:

$arr1 = array
(
    'xyz' => 'value'
);

$arr2 = array
(
    'x' => array
    (
        'y' => array
        (
            'z' => 'value',
        ),
    ),
);

কীভাবে আপনি অ্যারে থেকে "মান" পাবেন? সাধারণ:

Value($arr1, 'xyz', 'returns this if the index does not exist');
Value($arr2, array('x', 'y', 'z'), 'returns this if the index does not exist');

আমরা ইতিমধ্যে ইউনি এবং বহু-মাত্রিক অ্যারেগুলি আবৃত করেছি, আমরা সম্ভবত আর কী করতে পারি?


উদাহরণস্বরূপ নিম্নলিখিত কোডের টুকরোটি নিন:

$url = '/programming/1960509';
$domain = parse_url($url);

if (is_array($domain) === true)
{
    if (array_key_exists('host', $domain) === true)
    {
        $domain = $domain['host'];
    }

    else
    {
        $domain = 'N/A';
    }
}
else
{
    $domain = 'N/A';
}

বেশ বিরক্তিকর তাই না? এখানে Value()ফাংশনটি ব্যবহার করে অন্য একটি পদ্ধতি দেওয়া হয়েছে :

$url = '/programming/1960509';
$domain = Value(parse_url($url), 'host', 'N/A');

অতিরিক্ত উদাহরণ হিসাবে, পরীক্ষার জন্য ফাংশনটি গ্রহণ করুনRealIP() :

$ip = Value($_SERVER, 'HTTP_CLIENT_IP', Value($_SERVER, 'HTTP_X_FORWARDED_FOR', Value($_SERVER, 'REMOTE_ADDR')));

ঝরঝরে, হাহ? ;)


6
"হ্যাক ফাংশনগুলির উপর নির্ভর করা যা ভবিষ্যতে তাদের আচরণ পরিবর্তন করতে পারে" ?! দুঃখিত, তবে এটি আমি পুরো সপ্তাহে শুনেছি সবচেয়ে হাস্যকর বিষয়। প্রথম সব, issetএবং emptyহয় ভাষা নির্মান না ফাংশন। দ্বিতীয়ত, কোনও মূল গ্রন্থাগার ফাংশন / ভাষা নির্ধারণ যদি তাদের আচরণ পরিবর্তন করে, আপনি ত্রুটিযুক্ত বা নাও হতে পারেন। array_key_existsতার আচরণে যদি পরিবর্তন হয়? উত্তরটি হ'ল যতক্ষণ না আপনি ডকুমেন্ট হিসাবে এটি ব্যবহার করছেন। এবং issetঠিক তাই ব্যবহার ডকুমেন্টেড হয়। সবচেয়ে খারাপ কেস ফাংশনগুলি একটি প্রধান রিলিজ সংস্করণ বা দুটিতে অবমূল্যায়ন করা হয়। এনআইএইচ সিনড্রোম খারাপ!
প্রতারণা করুন

আমি দুঃখিত deceze, কিন্তু প্রথম সব হ্যাক হয় তির্যক যদি আপনি খেয়াল করেন নি। =) দ্বিতীয়ত, আপনার অর্থ এই যে কোনও অ্যারেতে কী উপস্থিত রয়েছেarray_key_exists() কিনা তা পরীক্ষা করে দেখার উপর নির্ভর করা উচিত নয় ?! ঠিক এর জন্যই তৈরি করা হয়েছিল , আমি বরং এই উদ্দেশ্যটির জন্য এবং বিশেষত যার সরকারী বিবরণটি হ'ল: "ভেরিয়েবলটি খালি কিনা তা নির্ধারণ করুন", এটি আসলে উপস্থিত থাকলে কিছুই উল্লেখ করে না। আপনার মন্তব্য এবং ডাউন-ভোট হ'ল আমি সমস্ত মাস দেখেছি এমন একটি হাস্যকর । array_key_exists()isset()empty()
অ্যালিক্স অ্যাক্সেল

4
আমি বলছি issetএবং emptyএর চেয়ে কম বা বেশি নির্ভরযোগ্য নয় array_key_existsএবং ঠিক একই কাজটি করতে পারে। আপনার দ্বিতীয়, দীর্ঘ-বায়ুযুক্ত উদাহরণটি $domain = isset($domain['host']) ? $domain['host'] : 'N/A';কেবল মূল ভাষার বৈশিষ্ট্য হিসাবে রচনা করা যেতে পারে , কোনও অতিরিক্ত ফাংশন কল বা ঘোষণাপত্রের প্রয়োজন নেই (নোট করুন যে আমি অবশ্যই টের্নারি অপারেটরের ব্যবহারের পক্ষে সমর্থন করি না; ও))। সাধারণ স্কেলার ভেরিয়েবলগুলির জন্য আপনাকে এখনও ব্যবহার করতে হবে issetবা empty, এবং আপনি এগুলি ঠিক একইভাবে ব্যবহার করতে পারেন। "নির্ভরযোগ্যতা" এটি না করার একটি খারাপ কারণ।
প্রতারণা করুন

4
আপনি আপনার বক্তব্য রেখেছেন, যদিও আপনি বলেছিলেন বেশিরভাগ জিনিসগুলির সাথে আমি একমত নই। আমি মনে করি আপনি 90% + ক্ষেত্রে ভুলভাবে ভুল পেয়েছেন, উদাহরণস্বরূপ আমি সমস্ত সময় ফর্মগুলিতে লুকানো ক্ষেত্রে "0" এর মানটি ব্যবহার করি। তবুও আমি বিশ্বাস করি যে আমি যে সমাধানটি সরবরাহ করেছি তা ডাউন-ভোটের যোগ্য নয় এবং পেকেকার পক্ষে কিছুটা কার্যকর হতে পারে
অ্যালিক্স অ্যাক্সেল

4
যদিও @ ডেসিজে কাস্টম ফাংশনগুলির সাথে একটি বক্তব্য রয়েছে - আমি সাধারণত একই অবস্থান গ্রহণ করি - মান () পদ্ধতির যথেষ্ট আকর্ষণীয় দেখায় যে আমি এটি একবার দেখব। আমি মনে করি উত্তর এবং অনুসরণ অনুসরণে প্রত্যেককেই নিজের মন তৈরি করতে সক্ষম করবে। +1
পেক্কা 15

3

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


4
isset () স্টাফ ডিফল্টরূপে সমস্ত কিছু শূন্য করা অনেক ঝামেলা বাঁচাতে পারে।
ভাভা

4
আর এই 'সবকিছু' কী? পিএইচপি-র পক্ষে প্রতিটি কল্পনাযোগ্য ভেরিয়েবলের নাম কল্পনা করা এবং প্রতিটি এনআরএল-তে সেট করা অপব্যয় বলে মনে হবে যাতে অলস বিকাশকারী 5 টি অক্ষর টাইপ করতে না পারে।
লোটাস নোটস

5
@ বায়রন, দেখুন, এটি সত্যিই সহজ, অনেক অন্যান্য ভাষা এটি করে, রুবি এবং পার্ল কয়েকটি উদাহরণ হিসাবে। ভিএম জানেন যে ভেরিয়েবল আগে ব্যবহৃত হত না, তাই না? এটি সর্বদা ত্রুটির বার্তাটি ব্যতীত বা ব্যর্থ হওয়ার পরিবর্তে নਾਲ ফিরে আসতে পারে। এবং এটি লসি 5 টি চরিত্র সম্পর্কে নয়, এটি কলগুলির params["width"] = params["width"] || 5সাথে সমস্ত বাজে কথা পরিবর্তে খেলাপি সেট করতে লিখতে হবে isset()
ভাভা

4
পুরানো থ্রেডটি পুনরুত্থিত করার জন্য দুঃখিত। পিএইচপি'র দু'টি ভ্রান্ত ভুল ছিল register_globalsএবং magic_quotes। এই পালক সমস্যার অবিচ্ছিন্ন পরিবর্তনগুলি তুলনা করে প্রায় নিরীহ দেখায়।
স্ট্যাটিক্সন

3

আমি এই ফাংশন ব্যবহার

function load(&$var) { return isset($var) ? $var : null; }
function POST($var) { return isset($_POST[$var]) ? $_POST[$var] : null; }

উদাহরণ

$y = load($x); // null, no notice

// this attitude is both readable and comfortable
if($login=POST("login") and $pass=POST("pass")) { // really =, not ==
  // executes only if both login and pass were in POST
  // stored in $login and $pass variables
  $authorized = $login=="root" && md5($pass)=="f65b2a087755c68586568531ad8288b4";
}

4
আমি এটিও ব্যবহার করি তবে মনে রাখবেন যে কোনও ক্ষেত্রে আপনার ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে আরম্ভ হবে: যেমন লোড ($ অ্যারে ['FOO']) $ অ্যারেতে একটি FOO কী তৈরি করবে।
মাদুর

2

স্বাগতম নাল কোয়ালেসিং অপারেটর (পিএইচপি> = 7.0.1):

$field = $_GET['field'] ?? null;

পিএইচপি বলে:

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


1

কোনও ফাংশন তৈরি করুন যা falseসেট না করা হলে, এবং যদি নির্দিষ্ট করা থাকে, falseখালি থাকে returns বৈধ হলে এটি ভেরিয়েবলটি প্রদান করে। নীচের কোডে দেখা হিসাবে আপনি আরও বিকল্প যুক্ত করতে পারেন:

<?php
function isset_globals($method, $name, $option = "") {
    if (isset($method[$name])) {    // Check if such a variable
        if ($option === "empty" && empty($method[$name])) { return false; } // Check if empty 
        if ($option === "stringLength" && strlen($method[$name])) { return strlen($method[$name]); }    // Check length of string -- used when checking length of textareas
        return ($method[$name]);
    } else { return false; }
}

if (!isset_globals("$_post", "input_name", "empty")) {
    echo "invalid";
} else {
    /* You are safe to access the variable without worrying about errors! */
    echo "you uploaded: " . $_POST["input_name"];
}
?>

0

সফ্টওয়্যার magশ্বরের অনুগ্রহে যাদুকরীভাবে চালিত হয় না। যদি আপনি এমন কিছু প্রত্যাশা করে যা অনুপস্থিত থাকে তবে আপনার এটি সঠিকভাবে পরিচালনা করা দরকার।

আপনি যদি এটিকে এড়িয়ে যান তবে আপনি সম্ভবত আপনার অ্যাপ্লিকেশনগুলিতে সুরক্ষা গর্ত তৈরি করছেন। স্থির ভাষায় অ-সংজ্ঞায়িত ভেরিয়েবল অ্যাক্সেস করা কেবল সম্ভব নয়। এটি সহজেই আপনার অ্যাপ্লিকেশনটি সংকলন বা ক্রাশ করবে না যদি এটি শূন্য হয়।

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


আমি পিএইচপি এর ঘাটতি সম্পর্কে ভালভাবে অবগত। আমি যেমন প্রশ্নটিতে ইঙ্গিত করেছি, আমি পুরানো প্রকল্পগুলির ওভারহোলিংয়ের কথা বলছি।
পেক্কা 15

রাজি। লিঙ্গ-টাইম পিএইচপি বিকাশকারী হওয়ায় জাভা এর মতো নতুন ভাষাগুলি চালানো আমার পক্ষে পক্ষে বেশ কঠিন, যেখানে আপনাকে সমস্ত কিছু জানাতে হবে।
Dzhuneyt

0

আপনার পঠনযোগ্যতার সংজ্ঞা কী তা আমি নিশ্চিত নই, তবে খালি (), আইসেট () ব্যবহার এবং ব্লক চেষ্টা / নিক্ষেপ / ক্যাচ ব্লকগুলি পুরো প্রক্রিয়াটির জন্য অত্যন্ত গুরুত্বপূর্ণ।

যদি আপনার E_NOTICE যদি $ _GET বা $ _POST থেকে আসে, তবে খালি () এর সাথে অন্য সমস্ত সুরক্ষা চেকের সাথে অবশ্যই সেই ডেটাটি পাস করতে হবে কিনা সেগুলি পরীক্ষা করা উচিত।

যদি এটি বাহ্যিক ফিড বা লাইব্রেরি থেকে আসে তবে এটি চেষ্টা / ধরাতে আবৃত করা উচিত।

যদি এটি ডাটাবেস থেকে আসে তবে $ db_num_rows () বা এর সমতুল্যটি পরীক্ষা করা উচিত।

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

এই জিনিসগুলি কোডটি দীর্ঘায়িত করে, অতিরিক্ত ব্লক যুক্ত করে এবং অতিরিক্ত পরীক্ষাগুলি যুক্ত করে, তবে আমি আপনার সাথে একমত নই যে আমি মনে করি তারা স্পষ্টতই অতিরিক্ত মান যুক্ত করে।


-2

@অপারেটর ব্যবহার সম্পর্কে কি ?

উদাহরণ স্বরূপ:

if(@$foo) { /* Do something */ }

আপনি বলতে পারেন এটি খারাপ কারণ আপনার "অভ্যন্তরীণ" $ foo এর কোনও নিয়ন্ত্রণ নেই (উদাহরণস্বরূপ যদি এটি কোনও ফাংশন কল ছিল যাতে পিএইচপি ত্রুটি থাকে) তবে আপনি যদি কেবল এই পরিবর্তনটি ভেরিয়েবলের জন্য ব্যবহার করেন তবে এটি সমান:

if(isset($foo) && $foo) { /* ... */ }

if(isset($foo))আসলে যথেষ্ট। TRUEঅভিব্যক্তিটি যদি মূল্যায়ন করে তবে এটি ফিরে আসবে TRUE
ডিজনেয়েট

4
@ কালারডাব্লুপিটকম যদি অভিব্যক্তিটিকে মিথ্যা হিসাবে মূল্যায়ন করে তবে এটিও সত্য হবে।
জন হুলকা

আপনার কেবলমাত্র এমন কোডের @ প্যারামিটারটি (নোটিশটি উপেক্ষা করার জন্য) ব্যবহার করা উচিত যা সত্যিকারের আরও বিকাশের অধীনে নেই, বা এক-সময় কোড বা বিদ্যমান প্রকল্পগুলির একটি দ্রুত-স্থিরতা, যাতে আপনি অন্য কাউকে দেখাতে চান না। তবে এটি দ্রুত হ্যাক করার পক্ষে একটি সাধারণ কাজ।
রুব্বো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.