পিএইচপিতে কাস্টিং ভেরিয়েবলগুলি টাইপ করুন, এটি করার জন্য ব্যবহারিক কারণ কী?


45

পিএইচপি, যেমন আমাদের বেশিরভাগই জানি, টাইপিং দুর্বল । যারা করেন না তাদের জন্য, পিএইচপি.এন.টি বলেছেন:

পিএইচপি-র পরিবর্তনশীল ঘোষণায় সুস্পষ্ট প্রকারের সংজ্ঞা (বা সমর্থন) প্রয়োজন হয় না; একটি ভেরিয়েবলের ধরণটি সেই প্রসঙ্গে নির্ধারণ করা হয় যেখানে ভেরিয়েবলটি ব্যবহৃত হয়।

এটি পছন্দ করুন বা এটি ঘৃণা করুন, পিএইচপি এই ফ্লাইতে চলকগুলি পুনরায় কাস্ট করে। সুতরাং, নিম্নলিখিত কোডটি বৈধ:

$var = "10";
$value = 10 + $var;
var_dump($value); // int(20)

পিএইচপি আপনাকে সুস্পষ্টভাবে একটি ভেরিয়েবল কাস্ট করার অনুমতি দেয়, যেমন:

$var = "10";
$value = 10 + $var;
$value = (string)$value;
var_dump($value); // string(2) "20"

এগুলি সবই দুর্দান্ত ... তবে আমার জীবনের জন্য, আমি এটি করার জন্য ব্যবহারিক কারণটি ধারণ করতে পারি না।

জাভা যেমন এটি সমর্থন করে এমন ভাষাগুলিতে শক্ত টাইপ করার ক্ষেত্রে আমার সমস্যা নেই। এটি ঠিক আছে, এবং আমি এটি পুরোপুরি বুঝতে পারি। এছাড়াও, আমি ফাংশন পরামিতিগুলিতে - টাইপ ইঙ্গিতটির - এবং এর কার্যকারিতা সম্পর্কে পুরোপুরি বুঝতে পারি ।

টাইপ কাস্টিংয়ের সাথে আমার যে সমস্যাটি রয়েছে তা উপরের উদ্ধৃতি দিয়ে ব্যাখ্যা করা হয়েছে। পিএইচপি ধরনের অদলবদল করতে পারেন অ্যাট ইচ্ছা , তাই পরেও আপনি কি করতে পারেন নিক্ষেপ বল একটি টাইপ; এবং যখন আপনাকে কোনও ক্রিয়াকলাপে নির্দিষ্ট ধরণের প্রয়োজন হয় তখন এটি ফ্লাই-অন-ফ্লাই করতে পারে । এটি নিম্নলিখিত বৈধ করে তোলে:

$var = "10";
$value = (int)$var;
$value = $value . ' TaDa!';
var_dump($value); // string(8) "10 TaDa!"

তাহলে কি লাভ?


এই বিশ্বের তাত্ত্বিক উদাহরণটি ধরুন যেখানে ব্যবহারকারী-সংজ্ঞায়িত টাইপ কাস্টিং পিএইচপি-তে উপলব্ধি করে :

  1. আপনি কাস্ট পরিবর্তনশীল জোর $fooযেমন int(int)$foo
  2. আপনি চলকটিতে একটি স্ট্রিং মান সংরক্ষণ করার চেষ্টা করেন $foo
  3. পিএইচপি একটি ব্যতিক্রম ছোঁড়ে !! ← এটি বোধগম্য হবে। হঠাৎ ব্যবহারকারীর সংজ্ঞায়িত ধরণের ingালাইয়ের কারণ বিদ্যমান!

পিএইচপি প্রয়োজন অনুসারে জিনিসগুলিকে স্যুইচ করবে এটি ব্যবহারকারীর সংজ্ঞায়িত ধরণের castালাই অস্পষ্ট করে তোলে। উদাহরণস্বরূপ, নিম্নলিখিত দুটি কোড নমুনা সমতুল্য:

// example 1
$foo = 0;
$foo = (string)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;

// example 2
$foo = 0;
$foo = (int)$foo;
$foo = '# of Reasons for the programmer to type cast $foo as a string: ' . $foo;

মূলত এই প্রশ্নটি করার এক বছর পরে, অনুমান করুন যে নিজেকে ব্যবহারিক পরিবেশে টাইপকাস্টিং ব্যবহার করেছেন? আপনার সত্যই।

প্রয়োজনটি ছিল একটি রেস্তোঁরা মেনুর জন্য কোনও ওয়েবসাইটে অর্থের মান প্রদর্শন করা। সাইটের নকশার জন্য প্রয়োজনীয় অনুসরণযোগ্য শূন্যগুলি ছাঁটাতে হবে, যাতে প্রদর্শনটি নিম্নলিখিতগুলির মতো দেখতে কিছুটা লাগে:

Menu Item 1 .............. $ 4
Menu Item 2 .............. $ 7.5
Menu Item 3 .............. $ 3

ভেরিয়েবলটিকে একটি ভাসমান হিসাবে কাস্ট করার জন্য আমি সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি:

$price = '7.50'; // a string from the database layer.
echo 'Menu Item 2 .............. $ ' . (float)$price;

পিএইচপি ফ্লোটের চলমান শূন্যগুলি ছাঁটাই করে, এবং তারপরে ফ্লোটটিকে সংক্ষিপ্তকরণের স্ট্রিং হিসাবে পুনরুদ্ধার করে।


এটি -> $ মান = $ মান। 'টাডা!'; Final মানের চূড়ান্ত মান নির্ধারণের পূর্বে string মানটিকে স্ট্রিংয়ে ফেরত দেয়। সত্যিই অবাক হওয়ার কিছু নেই যে আপনি যদি টাইপ কাস্ট করতে বাধ্য করেন তবে আপনি টাইপ কাস্ট পাবেন। নিশ্চিত না যে বিষয়টি জানতে চাওয়ার মূল বিষয়টি কী?
ক্রিস

"# 3। পিএইচপি একটি ব্যতিক্রম ছুঁড়ে ফেলেছে !! <--- তা বোঝা যাবে" " আসলে তা মোটেই বোঝা যায় না। এটি জাভা, জাভাস্ক্রিপ্ট বা আমি জানি যে কোনও সি-সিনট্যাক্স ভাষাতেও সমস্যা নয়। তাদের সঠিক মনের মধ্যে কে এই পছন্দসই আচরণ হিসাবে দেখতে পাবে? আপনি কি সর্বত্র(string) কাস্ট করতে চান ?
নিকোল

@ রেনিসিস: আপনি আমাকে ভুল বুঝেছেন। আমার অর্থ হ'ল কোনও ব্যতিক্রম কেবল তখনই ছুঁড়ে ফেলা হবে যদি কোনও ব্যবহারকারী কোনও ভেরিয়েবল টাইপ-কাস্ট করে থাকে। স্বাভাবিক আচরণ (যেখানে পিএইচপি আপনার জন্য কাস্টিং দেয়) অবশ্যই একটি ব্যতিক্রম ছুঁড়ে মারবে না। আমি বলার চেষ্টা করছি যে ব্যবহারকারীর সংজ্ঞায়িত টাইপ কাস্টিংটি মোট , তবে যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে হঠাৎ তা বোঝা যাবে।
স্টিফেন

যদি আপনি বলছেন যে $intval.'bar'ব্যতিক্রম ছুঁড়ে মারছে, আমি এখনও তাতে একমত নই। এটি কোনও ভাষায় ব্যতিক্রম ঘটায় না। (আমার জানা সমস্ত ভাষা একটি স্বয়ংক্রিয় কাস্ট বা একটি সম্পাদন করে .toString())। যদি আপনি বলছেন যে $intval = $stringvalব্যতিক্রম ছোঁড়াচ্ছে, তবে আপনি দৃ strongly়ভাবে টাইপ করা ভাষার কথা বলছেন। আমি অসভ্য শব্দ বলতে চাইনি, তাই, দুঃখিত যদি আমি তা করি। আমি কেবলমাত্র মনে করি এটি প্রতিটি বিকাশকারীদের যা ব্যবহৃত হয় তার বিপরীতে যায় এবং এটি অনেক কম সুবিধাজনক।
নিকোল

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

উত্তর:


32

দুর্বলভাবে টাইপ করা ভাষায়, টাইপ-কাস্টিং টাইপড ক্রিয়াকলাপগুলিতে অস্পষ্টতা অপসারণের জন্য উপস্থিত থাকে, অন্যথায় সংকলক / দোভাষা কোন ক্রিয়াকলাপটি ব্যবহার করবেন তা অনুমান করার জন্য আদেশ বা অন্যান্য নিয়ম ব্যবহার করবে।

সাধারণত আমি বলব পিএইচপি এই ধরণটি অনুসরণ করে তবে আমি যেসব ক্ষেত্রে পরীক্ষা করেছি সেগুলির মধ্যে পিএইচপি প্রতিটি ক্ষেত্রে পাল্টা স্বজ্ঞাত আচরণ করেছে।

তুলনামূলক ভাষা হিসাবে জাভাস্ক্রিপ্ট ব্যবহার করে সেগুলি এখানে।

স্ট্রিং কনক্যাটেন্টেশন

স্পষ্টতই এটি পিএইচপি-তে কোনও সমস্যা নয় কারণ পৃথক স্ট্রিং কনকনেটেশন ( .) এবং সংযোজন ( +) অপারেটর রয়েছে।

জাভাস্ক্রিপ্ট
var a = 5;
var b = "10"
var incorrect = a + b; // "510"
var correct = a + Number(b); // 15

স্ট্রিং তুলনা

প্রায়শই কম্পিউটার সিস্টেমে "5" "10" এর চেয়ে বেশি হয় কারণ এটি এটি একটি সংখ্যা হিসাবে ব্যাখ্যা করে না। পিএইচপি-তে এটি নয়, যা উভয় স্ট্রিং হলেও , তারা বুঝতে পারে যে তারা সংখ্যা এবং একটি নিক্ষেপের প্রয়োজনীয়তা অপসারণ করে:

জাভাস্ক্রিপ্ট
console.log("5" > "10" ? "true" : "false"); // true
পিএইচপি
echo "5" > "10" ? "true" : "false";  // false!

ফাংশন স্বাক্ষর টাইপিং

পিএইচপি ফাংশন স্বাক্ষরগুলিতে খালি-হাড়ের টাইপ-চেকিং প্রয়োগ করে, তবে দুর্ভাগ্যক্রমে এটি এতটা ত্রুটিযুক্ত এটি সম্ভবত বিরল ব্যবহারযোগ্য।

আমি ভেবেছিলাম আমি সম্ভবত কিছু ভুল করছি, তবে ডক্সের একটি মন্তব্য নিশ্চিত করেছে যে অ্যারে ব্যতীত অন্তর্নির্মিত প্রকারগুলি পিএইচপি ফাংশন স্বাক্ষরগুলিতে ব্যবহার করা যাবে না - ত্রুটি বার্তাটি বিভ্রান্তিমূলক হলেও।

পিএইচপি
function testprint(string $a) {
    echo $a;
}

$test = 5;
testprint((string)5); // "Catchable fatal error: Argument 1 passed to testprint()
                      //  must be an instance of string, string given" WTF?

এবং আমি জানি অন্য যে কোনও ভাষার চেয়ে আলাদা, আপনি যদি বোঝেন এমন কোনও ধরণের ব্যবহার করেন তবে নালকে আর এই আর্গুমেন্টে ( must be an instance of array, null given) দেওয়া যায় না। কিভাবে মূঢ়.

বুলিয়ান ব্যাখ্যা

[ সম্পাদনা ]: এটি নতুন। আমি অন্য একটি কেস নিয়ে ভাবলাম, এবং আবার যুক্তিটি জাভাস্ক্রিপ্ট থেকে বিপরীত হয়েছে।

জাভাস্ক্রিপ্ট
console.log("0" ? "true" : "false"); // True, as expected. Non-empty string.
পিএইচপি
echo "0" ? "true" : "false"; // False! This one probably causes a lot of bugs.

সুতরাং উপসংহারে, কেবলমাত্র দরকারী ক্ষেত্রে আমি ভাবতে পারি তা হ'ল ... (ড্রামলল)

ছাঁটাই টাইপ করুন

অন্য কথায়, যখন আপনার এক প্রকারের মান (স্ট্রিং বলুন) থাকে এবং আপনি এটিকে অন্য প্রকারের (int) হিসাবে ব্যাখ্যা করতে চান এবং আপনি এটিকে সেই ধরণের মানগুলির একটি বৈধ সেট হতে বাধ্য করতে চান:

$val = "test";
$val2 = "10";
$intval = (int)$val; // 0
$intval2 = (int)$val2; // 10
$boolval = (bool)$intval // false
$boolval2 = (bool)$intval2 // true
$props = (array)$myobject // associative array of $myobject's properties

আমি কী দেখতে পাচ্ছি না যে কী আপকাস্টিং (এমন ধরণের যা আরও বেশি মানকে অন্তর্ভুক্ত করে) সত্যিই আপনাকে কখনই লাভ করবে।

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


ঠিক আছে, E_NOTICEতখন কেমন হবে? :)
স্টিফেন

@ স্টিফেন E_NOTICEহয়ত ঠিক আছে, তবে আমার কাছে দ্ব্যর্থহীন অবস্থা সম্পর্কিত - ভেরিয়েবলটি যদি সেই অবস্থায় (অন্য কোথাও ফেলে দেওয়া হয়েছিল) হয় তবে আপনি কীভাবে একটি বিট কোড দেখে বুঝতে পারবেন? এছাড়াও, আমি অন্য শর্তটি পেয়েছি এবং এটি আমার উত্তরে যুক্ত করেছি।
নিকোল

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

বিভ্রান্তিতে কিছুটা জুড়তে: echo "010" == 010 এবং echo "0x10" == 0x10;-)
ভের্টেক

1
নোট করুন যে পিএইচপি 7 হিসাবে, স্কেলারার টাইপ ইঙ্গিত সম্পর্কিত এই উত্তরের নোটগুলি সঠিক নয়।
জন ভি।

15

আপনি দুর্বল / শক্তিশালী এবং গতিশীল / স্ট্যাটিক ধরণের ধারণার মিশ্রণ করছেন।

পিএইচপি দুর্বল এবং গতিশীল, তবে আপনার সমস্যাটি গতিশীল ধরণের ধারণার সাথে। এর অর্থ, ভেরিয়েবলগুলির কোনও প্রকার নেই, মানগুলি থাকে।

একটি 'টাইপ কাস্টিং' এমন একটি অভিব্যক্তি যা বিভিন্ন ধরণের আসলটির একটি নতুন মান উত্পাদন করে; এটি ভেরিয়েবলের জন্য কিছু করে না (যদি কেউ জড়িত থাকে)।

আমি নিয়মিতভাবে কাস্ট মানগুলি টাইপ করি সেই একের সংখ্যাটি হ'ল সংখ্যার এসকিউএল পরামিতি। আপনি এসকিউএল স্টেটমেন্টগুলিতে anyোকানো যেকোন ইনপুট মান স্যানিটাইজ / এড়িয়ে যাওয়ার কথা, বা (আরও ভাল) প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করুন। তবে, আপনি যদি এমন কোনও মান চান যে এটি একটি পূর্ণসংখ্যার হতে পারে তবে কেবল এটি কাস্ট করা আরও সহজ।

বিবেচনা:

function get_by_id ($id) {
   $id = (int)$id;
   $q = "SELECT * FROM table WHERE id=$id LIMIT 1";
   ........
}

যদি আমি প্রথম লাইনটি ছেড়ে দিয়ে যাই তবে $idএসকিউএল ইঞ্জেকশনের জন্য একটি সহজ ভেক্টর হবে। Castালাই নিশ্চিত করে যে এটি কোনও ক্ষতিকারক পূর্ণসংখ্যা; কিছু এসকিউএল সন্নিবেশ করার যে কোনও প্রয়াসের জন্য কেবল কোনও প্রশ্নের জন্য ফলাফল পাওয়া যাবেid=0


আমি এটা গ্রহণ করব। এখন, টাইপ কাস্টিং এর উপযোগিতা কোথায়?
স্টিফেন

এটি মজার যে আপনি এসকিউএল ইঞ্জেকশন নিয়ে এসেছেন। আমি ব্যবহারকারী ইনপুট স্যানিটাইজ করতে এই কৌশলটি ব্যবহার করে এমন কারও সাথে এসও নিয়ে বিতর্ক করছিলাম। কিন্তু এই পদ্ধতিটি mysql_real_escape_string($id);কী ইতিমধ্যে সমাধান করে না তা সমাধান করে?
স্টিফেন

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

2
mysql_real_escape_string()'0x01ABCDEF' (যেমন একটি পূর্ণসংখ্যার হেক্সাডেসিমাল উপস্থাপনা) এর মতো স্ট্রিংগুলিতে কিছুই না করার দুর্বলতা রয়েছে। কিছু মাল্টিবাইট এনকোডিংগুলিতে (ইউনিকোড ভাগ্যক্রমে নয়) কোয়েরিটি ভাঙতে এর মতো একটি স্ট্রিং ব্যবহার করা যেতে পারে (কারণ এটি মাইএসকিউএল দ্বারা মূল্যায়ন করে এমন কিছুতে মূল্যায়ন হয়)। এটা কেন তন্ন তন্ন এর mysql_real_escape_string()কিংবা is_int()পূর্ণসংখ্যা মান মোকাবেলার জন্য সবচেয়ে ভাল পছন্দ। টাইপকাস্টিং হয়।
Mchl

আরও কিছু বিশদ সহ একটি লিঙ্ক: ilia.ws/archives/…
Mchl

4

পিএইচপি-তে টাইপ কাস্টিংয়ের জন্য একটি ব্যবহার যা আমি পেয়েছি:

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন বিকাশ করছি যা একটি সার্ভারে পিএইচপি স্ক্রিপ্টগুলিতে একটি ডেটাবেস থেকে ডেটা পুনরুদ্ধারের জন্য HTTP অনুরোধ করে। স্ক্রিপ্টটি পিএইচপি অবজেক্ট (বা এসোসিয়েটিভ অ্যারে) আকারে ডেটা সঞ্চয় করে এবং অ্যাপ্লিকেশনটিতে একটি JSON অবজেক্ট হিসাবে ফিরে আসে। প্রকারের ingালাই ছাড়াই আমি এরকম কিছু পেতে পারি:

{ "user" : { "id" : "1", "name" : "Bob" } }

তবে, পিএইচপি (int)বিষয়বস্তু যখন পিএইচপি অবজেক্টটি সংরক্ষণ করে তখন ব্যবহারকারীর আইডিতে পিএইচপি টাইপ কাস্টিং ব্যবহার করে , আমি এটি পরিবর্তে অ্যাপটিতে ফিরে আসব:

{ "user" : { "id" : 1, "name" : "Bob" } }

তারপরে যখন JSON অবজেক্টটি অ্যাপে পার্স করা হয়, তখন এটি আইডিটিকে কোনও পূর্ণসংখ্যার পার্স করা থেকে বাঁচায়!

দেখুন, খুব দরকারী।


আমি বহিরাগত, শক্ত-টাইপ করা সিস্টেমগুলি গ্রাহনের জন্য ডেটা ফর্ম্যাট করার বিষয়টি বিবেচনা করি নি। +1
স্টিফেন

ইলাস্টিকসার্কের মতো বাহ্যিক সিস্টেমে জেএসএন-এর সাথে কথা বলার সময় এটি বিশেষভাবে সত্য। একটি জসন_নকোড () - এড মান "5" 5 এর মানের তুলনায় খুব আলাদা ফলাফল দেবে
জোহান ফ্রেডরিক ভারেন

3

একটি উদাহরণ __to স্ট্রিং পদ্ধতিযুক্ত বস্তু: $str = $obj->__toString();বনাম $str = (string) $obj;। সেকেন্ডে টাইপিং অনেক কম এবং অতিরিক্ত জিনিসগুলি বিরামচিহ্ন, যা টাইপ করতে বেশি সময় নেয়। আমি আরও মনে করি এটি আরও পঠনযোগ্য, যদিও অন্যেরা এতে দ্বিমত পোষণ করতে পারে।

অন্যটি একটি একক-উপাদান অ্যারে তৈরি করছে: array($item);বনাম (array) $item;। এটি কোনও অ্যারের মধ্যে কোনও স্কেলার প্রকার (পূর্ণসংখ্যা, সংস্থান ইত্যাদি) রাখবে।
পর্যায়ক্রমে, যদি $itemকোনও বস্তু হয় তবে এর বৈশিষ্ট্যগুলি তাদের মানগুলির মূল কী হয়ে যাবে। যাইহোক, আমি মনে করি যে অবজেক্ট-> অ্যারে রূপান্তরটি কিছুটা অদ্ভুত: ব্যক্তিগত এবং সুরক্ষিত বৈশিষ্ট্যগুলি অ্যারের অংশ, এবং নাম পরিবর্তিত হয়েছে। পিএইচপি ডকুমেন্টেশন উদ্ধৃত করার জন্য : ব্যক্তিগত ভেরিয়েবলের বর্গের নামটি ভেরিয়েবলের নামের সাথে সংযুক্ত করা হয়; সুরক্ষিত ভেরিয়েবলের ভেরিয়েবল নামের একটি '*' থাকে।

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


টাইপ কাস্টিং কীভাবে কাজ করে তার দুর্দান্ত উদাহরণ। তবুও, আমি নিশ্চিত নই যে তারা একটি প্রয়োজনীয়তা পূরণ করেছে । হ্যাঁ, আপনি কোনও বস্তুকে অ্যারেতে রূপান্তর করতে পারেন, তবে কেন? আমি অনুমান করি কারণ আপনি তখন নতুন অ্যারেটিতে অগণিত পিএইচপি অ্যারে ফাংশনগুলি ব্যবহার করতে পারেন তবে কীভাবে এটি কার্যকর হবে তা আমি বুঝতে পারি না। এছাড়াও, পিএইচপি সাধারণত কোনও মাইএসকিউএল ডাটাবেসে প্রেরণের জন্য স্ট্রিং কোয়েরি তৈরি করে, তাই ভেরিয়েবল টাইপটি অপ্রাসঙ্গিক ( কোয়েরিটি তৈরির সময় স্বয়ংক্রিয় স্ট্রিং রূপান্তর intবা floatঘটবে)। (array) $itemহয় ঝরঝরে কিন্তু দরকারী?
স্টিফেন

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

আহা! প্যারামিটারাইজড কোয়েরিগুলির সাথে আপনি কোনও বৈধ কারণ হিট করেছেন।
স্টিফেন

0

এই লিপি:

$tags = _GET['tags'];
foreach ($tags as $tag) {
    echo 'tag: ', $tag;
}

এর জন্য জরিমানা চলবে script.php?tags[]=oneতবে ব্যর্থ হবে script.php?tags=one, কারণ _GET['tags']প্রথম ক্ষেত্রে অ্যারে প্রদান করে তবে দ্বিতীয় ক্ষেত্রে নয়। যেহেতু স্ক্রিপ্টটি অ্যারের প্রত্যাশার জন্য লেখা হয়েছে (এবং স্ক্রিপ্টে পাঠানো ক্যোরিয় স্ট্রিংয়ের উপরে আপনার কম নিয়ন্ত্রণ রয়েছে) তাই যথাযথভাবে ফলাফলটি ফেলে সমস্যার সমাধান করা যেতে পারে _GET:

$tags = (array) _GET['tags'];
foreach ($tags as $tag) {
    echo 'tag: ', $tag;
}

0

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

$amount = (float) $_POST['amount'];

if( $amount > 0 ){
    $remoteService->doacalculationwithanumber( $amount );    
}

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


1
তা বাদে তা ভেঙে যায় না। এমনকি যদি $_POST['amount']কোনও জঞ্জালের স্ট্রিং থাকে তবে পিএইচপি মূল্যায়ন করবে যে এটি শূন্যের চেয়ে বেশি নয়। এটিতে যদি একটি স্ট্রিং থাকে যা ইতিবাচক সংখ্যাকে উপস্থাপন করে তবে এটি সত্যের মূল্যায়ন করবে।
স্টিফেন

1
সম্পূর্ণ সত্য নয়। বিবেচনা করুন $ শর্তসাপেক্ষে কোনও তৃতীয় পক্ষের পরিষেবাতে অর্থ পাঠানো হচ্ছে যা অবশ্যই একটি নম্বর গ্রহণ করবে। যদি কেউ $ _POST ['পরিমাণ'] = "100 বোবিন" এ পাস করেন, অপসারণ (ভাসা) এখনও শর্তসাপেক্ষে পাস হতে পারে তবে $ পরিমাণটি কোনও সংখ্যা হবে না।
গ্রুফপুটস

-2

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

একটি কোডার (নোট করুন যে আমি বিকাশকারীকে বলিনি) যার কোডটি আমি উত্তরাধিকার সূত্রে পেয়েছি এবং এখনও বজায় রেখেছি তা জানে না যে সুপার ভেরিয়েবেলে ফিরে আসা স্ট্রিংয়ের মধ্যে পার্থক্য রয়েছে যা সে পূর্ণ সংখ্যার ক্রিয়াকলাপে যুক্ত করে"20"$_GET20 + 20 যখন ডাটাবেসের মান। তিনি কেবল ভাগ্যবান যে পিএইচপি .স্ট্রিং কনটেনটেশনের জন্য ব্যবহার +করে এবং অন্যান্য ভাষার মতো নয় , কারণ আমি তার কোডটি দুটি স্ট্রিং "যুক্ত" ( varcahrমাইএসকিউএল থেকে একটি মান $_GETএবং এর থেকে একটি মান ) দেখেছি এবং একটি অন্তর্দৃষ্টি পেয়েছি ।

এটি কি বাস্তব উদাহরণ? কেবল এই অর্থে যে এটি কোডারদের কী ডেটাটাইপগুলি নিয়ে কাজ করছে তা না জেনে দূরে সরে যেতে দেয়। আমি ব্যক্তিগতভাবে এটি ঘৃণা করি।


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

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