সহজেই এই সমস্যাটি ঠিক করার কোনও উপায় আছে বা আমার কি সমস্ত লিগ্যাসি কোডটি আবার লিখতে হবে?
পিএইচপি মারাত্মক ত্রুটি: 30-লাইনে কল-টাইম পাস-বাই-রেফারেন্স সরানো হয়েছে
কোড জুড়ে রেফারেন্স হিসাবে ভেরিয়েবলগুলি ফাংশনে প্রেরণ করা হওয়ায় এটি সর্বত্র ঘটে।
সহজেই এই সমস্যাটি ঠিক করার কোনও উপায় আছে বা আমার কি সমস্ত লিগ্যাসি কোডটি আবার লিখতে হবে?
পিএইচপি মারাত্মক ত্রুটি: 30-লাইনে কল-টাইম পাস-বাই-রেফারেন্স সরানো হয়েছে
কোড জুড়ে রেফারেন্স হিসাবে ভেরিয়েবলগুলি ফাংশনে প্রেরণ করা হওয়ায় এটি সর্বত্র ঘটে।
উত্তর:
আপনার আসল কল নয়, ফাংশন সংজ্ঞায় রেফারেন্স দিয়ে কলটি চিহ্নিত করা উচিত। যেহেতু পিএইচপি 5.3 সংস্করণে অবমূল্যায়ন ত্রুটিগুলি দেখানো শুরু করেছে, আমি বলব কোডটি পুনরায় লেখাই ভাল ধারণা হবে।
কোনও ফাংশন কলে কোনও রেফারেন্স সাইন নেই - কেবলমাত্র ফাংশন সংজ্ঞাতে। কার্যকারিতা সংজ্ঞাগুলি সঠিকভাবে রেফারেন্স দ্বারা যুক্তিটি পাস করার জন্য যথেষ্ট। পিএইচপি ৫.৩.০ অনুসারে, আপনি একটি সতর্কতা পেয়ে যাবেন যে আপনি যখন ব্যবহার করবেন তখন "কল-টাইম পাস-বাই-রেফারেন্স" অবচিত
&
হয়foo(&$a);
।
উদাহরণস্বরূপ, ব্যবহারের পরিবর্তে:
// Wrong way!
myFunc(&$arg); # Deprecated pass-by-reference argument
function myFunc($arg) { }
ব্যবহার করুন:
// Right way!
myFunc($var); # pass-by-value argument
function myFunc(&$arg) { }
E_COMPILE_WARNING
স্তর ত্রুটি দেওয়ার জন্য, রেফারেন্সের জন্য: php.net/manual/en/…
যে কেউ আমার মতো এটি পড়েন কারণ তাদের একটি বিশাল লিগ্যাসি প্রজেক্ট 5.6-তে আপডেট করা দরকার: উত্তরগুলি এখানে যেমন উল্লেখ করেছে, তাত্ক্ষণিকভাবে কোনও স্থিরতা নেই: আপনাকে সমস্যাটির প্রতিটি ঘটনা নিজেই খুঁজে পেতে এবং এটি সমাধান করতে হবে ।
একটি প্রকল্পে সমস্ত সমস্যাযুক্ত লাইনগুলি খুঁজে পেতে আমি সবচেয়ে সুবিধাজনক উপায় খুঁজে পেয়েছি (একটি পূর্ণ-বর্ধিত স্ট্যাটিক কোড বিশ্লেষক ব্যবহারের সংক্ষিপ্ততা, যা খুব নির্ভুল তবে আমি এখনই সম্পাদককে সঠিক অবস্থানে নিয়ে যাওয়া এমন কোনও কিছুই জানি না) ভিজ্যুয়াল স্টুডিও কোডটি ব্যবহার করছিল, যার মধ্যে একটি দুর্দান্ত পিএইচপি লিন্টার অন্তর্নির্মিত রয়েছে এবং এর অনুসন্ধান বৈশিষ্ট্য যা রেজেক্স দ্বারা অনুসন্ধানের অনুমতি দেয়। (অবশ্যই, আপনি এটির জন্য যে কোনও আইডিই / কোড সম্পাদক ব্যবহার করতে পারেন যা পিএইচপি লিটিং এবং রেজেক্স অনুসন্ধান করে))
এই রেজেক্স ব্যবহার করে:
^(?!.*function).*(\&\$)
&$
কোনও ফাংশন সংজ্ঞা নয় এমন লাইনগুলিতে ঘটনার জন্য প্রকল্প-ব্যাপী অনুসন্ধান করা সম্ভব ।
এটি এখনও অনেকগুলি মিথ্যা ইতিবাচক বিষয়টিকে সক্রিয় করে তোলে তবে এটি কাজটি আরও সহজ করে তোলে।
ভিএসকোডের অনুসন্ধান ফলাফলের ব্রাউজারটি আক্রমণাত্মক লাইনগুলি খুব সহজেই চলতে পারে এবং এটি সন্ধান করে। আপনার যা ঠিক করা দরকার।
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
পিএইচপি এবং রেফারেন্স কিছুটা অপ্রয়োজনীয়। সঠিক স্থানে যথাযথভাবে রেফারেন্স ব্যবহার করা হলে বড় পারফরম্যান্সের উন্নতি সরবরাহ করতে পারে বা খুব কুৎসিত workarouts এবং অস্বাভাবিক কোড এড়াতে পারে।
নিম্নলিখিতটি একটি ত্রুটি তৈরি করবে:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
এগুলির কোনওটিই নীচের নিয়মগুলি অনুসরণ করতে পারায় ব্যর্থ হতে হবে না তবে অনেক উত্তরাধিকারের বিভ্রান্তি রোধ করতে কোনও সন্দেহই সরিয়ে দেওয়া বা অক্ষম করা হয়নি।
যদি তারা কাজ করে, তবে উভয়ই রেফারেন্সের ক্ষেত্রে অপ্রয়োজনীয় রূপান্তর জড়িত এবং দ্বিতীয়টিতে একটি অতিরিক্ত বাছাইযুক্ত ভেরিয়েবলের কাছে রিডানড্যান্ট রূপান্তর জড়িত।
দ্বিতীয়টি সম্ভব হয়েছিল যে কোনও রেফারেন্সকে কোডে পাস করার অনুমতি দেওয়া হয়েছিল যা রেফারেন্স সহ কাজ করার উদ্দেশ্যে নয়। এটি রক্ষণাবেক্ষণের জন্য অত্যন্ত কুৎসিত।
এটি কিছুই করবে না:
function f($v){$v = true;}
$r = &$v;
f($r);
আরও সুনির্দিষ্টভাবে, আপনি রেফারেন্সের জন্য জিজ্ঞাসা না করায় এটি রেফারেন্সটিকে সাধারণ পরিবর্তনশীলে পরিণত করে।
এটি কাজ করবে:
function f(&$v){$v = true;}
f($v);
এটি দেখতে পাচ্ছে যে আপনি একটি অ-রেফারেন্স পাস করছেন তবে একটি রেফারেন্স চান যাতে এটি একটি রেফারেন্সে রূপান্তরিত হয়।
এর অর্থ হ'ল আপনি এমন কোনও ফাংশনের রেফারেন্সটি পাস করতে পারবেন না যেখানে পিএইচপি কয়েকটি ধরণের ক্ষেত্রে প্রেরণে কঠোর হয় বা এই ক্ষেত্রে আরও একটি মেটা ধরণের ক্ষেত্রে এমন কিছু অঞ্চল তৈরি করার জন্য স্পষ্টভাবে কোনও রেফারেন্স জিজ্ঞাসা করা হয় না।
আপনার যদি আরও গতিশীল আচরণের প্রয়োজন হয় তবে এটি কাজ করবে:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
এখানে এটি দেখেছে যে আপনি একটি রেফারেন্স চান এবং ইতিমধ্যে একটি রেফারেন্স রয়েছে তাই এটি একা রেখে দেয়। এটি রেফারেন্সটিকে শৃঙ্খলাবদ্ধও করতে পারে তবে আমি সন্দেহ করি।