পিএইচপি 5.4 কল-সময় পাস-বাই রেফারেন্স - সহজ ফিক্স পাওয়া যায়?


219

সহজেই এই সমস্যাটি ঠিক করার কোনও উপায় আছে বা আমার কি সমস্ত লিগ্যাসি কোডটি আবার লিখতে হবে?

পিএইচপি মারাত্মক ত্রুটি: 30-লাইনে কল-টাইম পাস-বাই-রেফারেন্স সরানো হয়েছে

কোড জুড়ে রেফারেন্স হিসাবে ভেরিয়েবলগুলি ফাংশনে প্রেরণ করা হওয়ায় এটি সর্বত্র ঘটে।


উত্তর:


344

আপনার আসল কল নয়, ফাংশন সংজ্ঞায় রেফারেন্স দিয়ে কলটি চিহ্নিত করা উচিত। যেহেতু পিএইচপি 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) { }

9
অবচয় হ'ল পিএইচপি 5.0.0 থেকে, সেই সময় ফিরে E_COMPILE_WARNINGস্তর ত্রুটি দেওয়ার জন্য, রেফারেন্সের জন্য: php.net/manual/en/…
হ্যাক্রে

5
আমার এই ত্রুটিটি ছিল তবে ভেরিয়েবলটি যুক্ত করার প্রয়োজন ও অপসারণের প্রয়োজন ছিল।
ডায়ানা

2
আমি এটি ইভেন্ট (& $ ইভেন্ট) নামক কোনও অবজেক্টের জন্য পুরানো কোডে ব্যবহার করেছি এবং ত্রুটি বার্তাটি অদৃশ্য হওয়ার জন্য এম্পারস্যান্ডটি সরিয়ে ফেলতে হয়েছিল।
নাটালিয়া

1
বিকাশকারী হিসাবে আমার সমস্ত বছরগুলিতে আমার কখনই পিএইচপি ব্যবহার করতে হবে না। কখনই না. এই আমি ঠিক খুঁজছিলাম ছিল। দুর্দান্ত
জুয়ান ভিলার

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

8

যে কেউ আমার মতো এটি পড়েন কারণ তাদের একটি বিশাল লিগ্যাসি প্রজেক্ট 5.6-তে আপডেট করা দরকার: উত্তরগুলি এখানে যেমন উল্লেখ করেছে, তাত্ক্ষণিকভাবে কোনও স্থিরতা নেই: আপনাকে সমস্যাটির প্রতিটি ঘটনা নিজেই খুঁজে পেতে এবং এটি সমাধান করতে হবে ।

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

এই রেজেক্স ব্যবহার করে:

^(?!.*function).*(\&\$)

&$কোনও ফাংশন সংজ্ঞা নয় এমন লাইনগুলিতে ঘটনার জন্য প্রকল্প-ব্যাপী অনুসন্ধান করা সম্ভব ।

এটি এখনও অনেকগুলি মিথ্যা ইতিবাচক বিষয়টিকে সক্রিয় করে তোলে তবে এটি কাজটি আরও সহজ করে তোলে।

ভিএসকোডের অনুসন্ধান ফলাফলের ব্রাউজারটি আক্রমণাত্মক লাইনগুলি খুব সহজেই চলতে পারে এবং এটি সন্ধান করে। আপনার যা ঠিক করা দরকার।


1
এটাই আমি খুঁজছিলাম!
সনি 18

4
এই উদ্দেশ্যে আমি আরও নিখুঁত রেগেক্স ব্যবহার করছি:(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
মজো

কেবল পিএইচপিসিএস ব্যবহার করুন, এটি আপনার জন্য প্রতিটি ফাইল খনন করবে।
থমাস চেং

6

পিএইচপি এবং রেফারেন্স কিছুটা অপ্রয়োজনীয়। সঠিক স্থানে যথাযথভাবে রেফারেন্স ব্যবহার করা হলে বড় পারফরম্যান্সের উন্নতি সরবরাহ করতে পারে বা খুব কুৎসিত 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);

এখানে এটি দেখেছে যে আপনি একটি রেফারেন্স চান এবং ইতিমধ্যে একটি রেফারেন্স রয়েছে তাই এটি একা রেখে দেয়। এটি রেফারেন্সটিকে শৃঙ্খলাবদ্ধও করতে পারে তবে আমি সন্দেহ করি।

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