কোনও ভাষা নির্মাণ এবং পিএইচপি-র একটি "বিল্ট-ইন" ফাংশনের মধ্যে পার্থক্য কী?


92

আমি জানি যে include, isset, require, print, echo, এবং কিছু অন্যদের ফাংশন কিন্তু ভাষা নির্মান নয়।

এর মধ্যে কিছু ভাষা নির্মাণের প্রথম বন্ধনী প্রয়োজন, অন্যদের দরকার নেই।

require 'file.php';
isset($x);

কারও কারও রিটার্ন ভ্যালু থাকে, আবার কারও থাকে না।

print 'foo'; //1
echo  'foo'; //no return value

সুতরাং একটি ভাষা নির্মাণ এবং একটি অন্তর্নির্মিত ফাংশন মধ্যে অভ্যন্তরীণ পার্থক্য কি ?

উত্তর:


131

(এটি আমার ইচ্ছা থেকে দীর্ঘতর; দয়া করে আমার সহ্য করুন।)

বেশিরভাগ ভাষাগুলি একটি "সিনট্যাক্স" নামক কিছু দ্বারা গঠিত: ভাষাটি বেশ কয়েকটি সু-সংজ্ঞায়িত কীওয়ার্ড নিয়ে গঠিত এবং আপনি যে ভাষায় রচনা করতে পারেন তার সম্পূর্ণ পরিসীমা সেই বাক্য গঠন থেকে তৈরি।

উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনার কাছে একটি সাধারণ চার-ফাংশন গাণিতিক "ভাষা" রয়েছে যা কেবলমাত্র একক-অঙ্কের পূর্ণসংখ্যাকে ইনপুট হিসাবে গ্রহণ করে এবং ক্রিয়াকলাপের ক্রমটিকে সম্পূর্ণ উপেক্ষা করে (আমি আপনাকে বলেছিলাম এটি একটি সহজ ভাষা ছিল)। এই ভাষাটি সিনট্যাক্স দ্বারা সংজ্ঞায়িত করা যেতে পারে:

// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /

এই তিনটি নিয়ম থেকে, আপনি একক-অঙ্কের ইনপুট গাণিতিক এক্সপ্রেশনগুলির সংখ্যা তৈরি করতে পারেন। এর পরে আপনি এই সিনট্যাক্স একটি পার্সার লিখতে পারেন যে তার উপাদান ধরনের মধ্যে কোনো বৈধ ইনপুট (প্রায় ভেঙে পড়েছে $expression, $numberঅথবা $operatorফলাফলের সঙ্গে) এবং পুলিশ। উদাহরণস্বরূপ, এক্সপ্রেশন 3 + 4 * 5নীচে হিসাবে ভেঙে যেতে পারে:

// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3 + 4 * 5
            = $expression $operator (4 * 5) // Expand into $exp $op $exp
            = $number $operator $expression // Rewrite: $exp -> $num
            = $number $operator $expression $operator $expression // Expand again
            = $number $operator $number $operator $number // Rewrite again

আসল প্রকাশের জন্য এখন আমাদের সংজ্ঞায়িত ভাষায় একটি সম্পূর্ণ পার্সড সিনট্যাক্স রয়েছে। একবার আমাদের এটি হয়ে গেলে, আমরা সমস্ত সংমিশ্রণের ফলাফলগুলি অনুসন্ধান করতে পার্সার লিখতে এবং লিখতে পারি এবং $number $operator $numberযখন কেবলমাত্র আমাদের একটি $numberবাকী থাকে তখন ফলাফল ছুঁতে পারি ।

মনে রাখবেন যে $expressionআমাদের আসল অভিব্যক্তিটির চূড়ান্ত বিশ্লেষণ সংস্করণে কোনও গঠনই বাকী নেই । এর কারণ $expressionহ'ল আমাদের ভাষার অন্যান্য জিনিসের সংমিশ্রণে সর্বদা হ্রাস করা যায়।

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

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

$expression := ($expression) | ...

কার্যকরভাবে, এই ভাষাটি যে কোনও মত প্রকাশ করতে এবং আশেপাশের বন্ধনীগুলি থেকে মুক্তি পেতে মুক্ত। পিএইচপি (এবং এখানে আমি নিখুঁত অনুমানের কাজ নিচ্ছি) এর ভাষা নির্মাণের জন্য অনুরূপ কিছু নিয়োগ করতে print("Hello")পারে : print "Hello"পার্স করার আগে এটি কমিয়ে আনা যেতে পারে , বা তদ্বিপরীত (ভাষার সংজ্ঞাগুলি প্রথম বন্ধনী যুক্ত করতে পারে এবং সেগুলি থেকে মুক্তি পেতে পারে)।

আপনি ভাষা নির্মান যেমন echoবা এর মতো নতুন সংজ্ঞা দিতে পারবেন না তার মূলে printএটি: পার্সারে কার্যকরভাবে হার্ডকোড করা হয়েছে, যেখানে ফাংশনগুলি ভাষা নির্মানের একটি সেটকে ম্যাপ করা হয় এবং পার্সার আপনাকে সেই সংকলন-বা রানটাইমের সময় সেই ম্যাপিংটি পরিবর্তন করতে দেয় আপনার নিজের ভাষা নির্মান বা এক্সপ্রেশনগুলির সেট সেট করুন।

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

অধিক তথ্য:

  • ব্যাকাস-নাউর ফর্ম , আনুষ্ঠানিক ভাষা সংজ্ঞায়িত করতে ব্যবহৃত সিনট্যাক্স (ইয়্যাক এই ফর্মটি ব্যবহার করে)

সম্পাদনা করুন: অন্যান্য উত্তরগুলির কয়েকটি পড়ে, লোকেরা ভাল পয়েন্ট দেয়। তাদের মধ্যে:

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

4
দুর্দান্ত উত্তর যা কেবলমাত্র পিএইচপি নয়, অনেকগুলি ভাষায় প্রয়োগের জন্য যথেষ্ট উন্মুক্ত enough ধন্যবাদ!
লেভি বোটেলহো

15

ভাষা নির্মাণগুলি ভাষা নিজেই সরবরাহ করে (যেমন "যদি", "যখন", ...) এর মতো নির্দেশাবলী; সুতরাং তাদের নাম।

এর একটি পরিণতি হ'ল প্রাক-সংজ্ঞায়িত বা ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির তুলনায় তারা দ্রুত আহ্বান জানায় (বা আমি শুনেছি / বেশ কয়েকবার পড়েছি)

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

function test($param) {}
if (test($a)) {
    // Notice: Undefined variable: a
}

if (isset($b)) {
    // No notice
}

* নোট করুন এটি সমস্ত ভাষার তৈরির ক্ষেত্রে নয়।

ফাংশন এবং ভাষা গঠনের মধ্যে আরেকটি পার্থক্য হ'ল এগুলির মধ্যে কিছুকে কোনও মূলশব্দের মতো বন্ধনী ছাড়াই ডাকা যেতে পারে।

এই ক্ষেত্রে :

echo 'test'; // language construct => OK

function my_function($param) {}
my_function 'test'; // function => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

এখানেও, সমস্ত ভাষা নির্মাণের ক্ষেত্রে এটি হয় না।

আমি মনে করি যে কোনও ভাষা নির্মাণকে "অক্ষম" করার কোনও উপায় নেই কারণ এটি ভাষারই অংশ of অন্যদিকে, প্রচুর "বিল্ট-ইন" পিএইচপি ফাংশনগুলি আসলেই অন্তর্নির্মিত নয় কারণ সেগুলি এক্সটেনশানগুলি সরবরাহ করে যেমন তারা সর্বদা সক্রিয় থাকে (তবে সবগুলিই নয়)

আর একটি পার্থক্য হ'ল ভাষার গঠনগুলি "ফাংশন পয়েন্টার" হিসাবে ব্যবহার করা যায় না (উদাহরণস্বরূপ, কলব্যাকস, মানে):

$a = array(10, 20);

function test($param) {echo $param . '<br />';}
array_map('test', $a);  // OK (function)

array_map('echo', $a);  // Warning: array_map() expects parameter 1 to be a valid callback, function 'echo' not found or invalid function name

এই মুহুর্তে আমার মনে অন্য কোনও ধারণা আসেনি ... এবং পিএইচপি-র অভ্যন্তরীণ সম্পর্কে আমি খুব বেশি কিছু জানি না ... তাই এখনই এটি হয়ে যাবে ^^

যদি আপনি এখানে খুব বেশি উত্তর না পান, সম্ভবত আপনি এটি মেইলিং-তালিকা ইন্টার্নালগুলিতে জানতে চাইতে পারেন ( http://www.php.net/mailing-lists.php দেখুন ), যেখানে অনেকগুলি পিএইচপি কোর-বিকাশকারী রয়েছে; তারাই সম্ভবত সেই জিনিস সম্পর্কে জানতে পারে ^^

(এবং আমি অন্যান্য উত্তরগুলি দ্বারা সত্যই আগ্রহী, বিটিডাব্লু ^^)

রেফারেন্স হিসাবে: পিএইচপি-তে কীওয়ার্ড এবং ভাষা গঠনের তালিকা


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

ওহ, সে সম্পর্কে ভাবেন নি :-( ধন্যবাদ!
পাস্কাল মার্টিন

4

কোডটি মোছার পরে, আমি খুঁজে পেয়েছি যে পিএইচপি একটি ইয়্যাক ফাইলটিতে কিছু বিবৃতি পার্স করে। সুতরাং তারা বিশেষ ক্ষেত্রে।

(জেন্ড / জেনড_ ভাষা_প্রেসার দেখুন y

তা বাদে আমি মনে করি না যে অন্যান্য পার্থক্য রয়েছে।


1

আপনি অন্তর্নির্মিত ফাংশনগুলিকে ওভাররাইড করতে পারেন । কীওয়ার্ডগুলি চিরকালের জন্য।


এটি কোনও অন্তর্নির্মিত ফাংশন নয়। এপিডি (উন্নত পিএইচপি ডিবাগার) এক্সটেনশনে সংজ্ঞায়িত করা হয়।
আয়নু জি স্টান 21

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