পিএইচপি-তে রেফারেন্সগুলি খুব কমই কেন ব্যবহৃত হয়?


26

আমার কিছু সি ++ জ্ঞান আছে এবং আমি জানি যে সেখানে পয়েন্টারগুলি সাধারণত ব্যবহৃত হয় তবে আমি পিএইচপি ওপেন সোর্স কোডটি দেখতে শুরু করেছি এবং পদ্ধতিগুলিতে রেফারেন্স ব্যবহার করে আমি কখনই কোড দেখতে পাচ্ছি না।

পরিবর্তে, কোডটি সর্বদা পদ্ধতিতে ভেরিয়েবলের রেফারেন্সটি পরিবর্তনের পরিবর্তে একটি রিটার্ন মান ব্যবহার করে, যা তারপরে সেই ভেরিয়েবলের মান পরিবর্তন করে এবং কেবল এটি প্রদান করে।

আমি পড়েছি যে রেফারেন্সগুলি ব্যবহার করে কম স্মৃতি ব্যবহার হয়, তবে কেন তারা পিএইচপি ব্যবহার করে না?


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

3
পিএইচপি ডিফল্টরূপে রেফারেন্স দ্বারা অবজেক্টগুলি পাস করে।

2
অ্যারে প্রকারভেদ মূল পিএইচপি ফাংশনগুলির একটি প্রধান উপস্থাপনা যা রেফারেন্স দ্বারা পাস হয়
মার্ক বাকের

2
পিএইচপি রেফারেন্সগুলি পয়েন্টার নয় এবং প্রায়শই গাধা ব্যথা হয়ে থাকে যদি আপনি তাদের কাছে উপস্থিত হন যেখানে তারা সম্পূর্ণরূপে প্রত্যাশা করছেন না।
ল্যানজ

2
আপনার যদি একাধিক রিটার্নের দরকার হয়, return array($foo, $bar);এবংlist($A, $B) = foobar();
ইজকাটা

উত্তর:


49

আপনার উল্লেখ যে উল্লেখগুলি খুব কমই ব্যবহৃত হয় তা ভুল। অন্যরা ইতিমধ্যে উল্লেখ করেছে যে উল্লেখ রয়েছে এমন একাধিক নেটিভ ফাংশন, উল্লেখযোগ্য উদাহরণগুলির মধ্যে অ্যারে বাছাই করা ফাংশন এবং preg_match()/ অন্তর্ভুক্ত রয়েছে preg_match_all()। আপনি যদি আপনার কোডটিতে এই ফাংশনগুলির কোনও ব্যবহার করে থাকেন তবে আপনি উল্লেখগুলিও ব্যবহার করছেন।

চলমান, পিএইচপি-তে রেফারেন্সগুলি পয়েন্টার নয় । যেহেতু আপনি একটি সি ++ ব্যাকগ্রাউন্ড থেকে এসেছেন আমি এই বিভ্রান্তি বুঝতে পারি, কিন্তু পিএইচপি রেফারেন্সগুলি সম্পূর্ণ ভিন্ন জন্তু, এগুলি একটি প্রতীক টেবিলের উপাধি । সি ++ রেফারেন্স থেকে আপনি যে কোনও পারফরম্যান্স লাভ আশা করেছিলেন এমনগুলি পিএইচপি রেফারেন্সের জন্য প্রযোজ্য নয়।

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

আপনার যখন প্রয়োজন হবে তখন পিএইচপি-তে রেফারেন্সগুলি ব্যবহার করতে ভয় পাবেন না, তবে কেবল এটি মাইক্রো-অপ্টিমাইজ করার চেষ্টা হিসাবে করবেন না। মনে রাখবেন, অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল

আরও পড়া:


সংশোধন @ নিকি'র জন্য ধন্যবাদ।
অলসতার

উত্তরটি সম্পূর্ণ করতে, এটি উল্লেখ করে ভালো লাগবে যে সমস্ত বস্তু পিএইচপি-তে রেফারেন্স দ্বারা পাস হয়েছে।
ফ্লোরিয়ান মার্জাইন

@ ফ্লোরিয়ানমারগাইন এটি সম্পূর্ণ সঠিক নয় (আরও পড়ার দ্বিতীয় লিঙ্কটি দেখুন)।
ইয়ান্নিস

2
@ ফ্লোরিয়ানমারগাইন না, দু'জনেই আলাদা এবং এটি কেন তা বুঝতে হবে তা জরুরী।
ফ্যান্ট0 মি

3
@FlorianMargaine না, খেয়েই বস্তু ছিল পিএইচপি রেফারেন্স দ্বারা পাস: f($obj)প্রদত্ত function f($x) { $x = new X; }, হবে আছে $objএকটি পড়ুন বিভিন্ন কল আগের চেয়ে বস্তু f()। যাইহোক, যেহেতু বস্তুগুলি রেফারেন্সের মাধ্যমে পাস হয় না , আপনি যদি পিএইচপি দিয়ে এটি সম্পাদন করেন তবে আপত্তিটি সংশোধিত হবে না। এই ভাবে, পিএইচপি জাভা হিসাবে একই কাজ করে।
ফ্যান্ট0 মি

8

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

এটিকে যুক্ত করুন যে রেফারেন্সগুলি জিনিসগুলিকে সাধারণভাবে কিছুটা মায়াবী করে তোলে। ডিফল্ট, এবং এইভাবে বেশিরভাগ লোকেরা যা প্রত্যাশা করে তা হ'ল পাস-বাই-মান; যখন আমি $iকোনও ফাংশনে পৌঁছে যাই, তখন এটি ফাংশনটি রহস্যজনকভাবে $iঅন্য কোনও কিছুতে পুরোপুরি পরিবর্তিত হয় কিনা তা যত্ন নেওয়ার জন্য বিষয়গুলিকে অত্যন্ত জটিল করে তোলে এবং এইভাবে কেবল ক্ষেত্রে ডিফেন্সিভ অনুলিপিগুলি তৈরি করে। ( $iমানটি কোনও বস্তু হলে এটি ইতিমধ্যে সংশোধন করতে পারে তবে আমার মতে এটি হওয়া উচিত নয়))

মূলত, আমি শুধু পাস-বাই-রেফারেন্স "আউট" পরামিতি জন্য দরকারী পাবেন, ভেরিয়েবল আমি আশা অর্থ ফেরত পেতে ফাংশন বদলে মধ্যে পাস, একটি লা থেকে preg_matchএর &$matches। এমনকি এমন ক্রিয়াকলাপগুলির জন্য যা অবজেক্টটি beingুকে যাচ্ছিল যা স্পষ্টভাবে সংশোধন করে, যেমন sortবা array_popকিছুটা অদ্ভুত মনে হয় ... তবে আমরা এটাই আটকে আছি।


5

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


1
এই. পয়েন্টার / রেফারেন্সের প্রয়োজন নেই, কারণ এটি সি ++ এর মতো নিম্ন স্তরের ক্ষেত্রে গোলমাল করছে না।
কেনেথ ওয়ার্ডেন

8
কেন এই পোস্টে 5+ পাওয়া যায় ??? এটি ক) প্রশ্নের উত্তর না দিয়ে খ) সঠিক নয়

1
সুতরাং রেফারেন্স ধীর হয় এবং খুব বেশি মেমরি গ্রাস করে?
রকেট হাজমত

1
@ রকেটহাজম্যাট হ্যাঁ, আশ্চর্যের বিষয় এটি যথেষ্ট সত্য।
ইয়ানিস

3

উড়ে যাওয়ার কিছু কারণ:

  • পিএইচপি হ'ল একটি স্ক্রিপ্টিং ভাষা এবং মূল এমবেডেড সফ্টওয়্যার হিসাবে ব্যবহার করার লক্ষ্য নেই (মূলত, স্ক্রিপ্টের শেষে মেমরিটি সাফ করা হয়),
  • পিএইচপি 5 এর পরে, পাস-বাই-রেফারেন্সটি অবজেক্ট পরামিতিগুলির জন্য অন্তর্নিহিত (তাই পিএইচপি "আপনার পিছনে" পাস-বাই-রেফারেন্স ব্যবহার করে)।

1
আপনার দ্বিতীয় দফার জন্য দেখুন: php.net/manual/en/language.oop5.references.php
ইয়ানিস

2

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

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


1

আপনার প্রশ্নের মূল সমস্যাটি হ'ল আপনি ধরে নিয়েছেন যে এটি সি ++ তেও সাধারণ। এটা না। আমরা আউটপুট প্যারামিটারগুলি পছন্দ করি না এবং এগুলি যতটা সম্ভব কম ব্যবহার করি - সেগুলি কেবল সি-স্টাইলের এপিআইতে সাধারণ common


0

আমি এমন অনেক পিএইচপি ফাংশন জানি । কটাক্ষপাত আছে preg_match()উদাহরণস্বরূপ। $matchesরেফারেন্স দ্বারা পাস করা হবে

আপনি যদি নিজের জন্য এমন একটি ফাংশন লিখতে চান যা রেফারেন্স অনুসারে যুক্তি গ্রহণ করে তবে নীচের বাক্য গঠনটি ব্যবহার করুন

function byref(&$a, &$b, $c) {
    $a += $c;
    $b += $c;
    return $a * $b;
}

$ a এবং $ b রেফারেন্স দিয়ে পাস হয় $ c মান দিয়ে পাস হয়।

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