দুটি কনস্ট্রাক্ট কেন?
মুদ্রণ এবং প্রতিধ্বনির সত্যতা হ'ল তারা যখন ব্যবহারকারীদের কাছে দুটি স্বতন্ত্র নির্মান হিসাবে উপস্থিত হয়, আপনি যদি বেসিকগুলিতে অবতীর্ণ হন তবে তারা অভ্যন্তরীণ উত্স কোডটি দেখুন তবে এগুলি উভয়ই সত্যই প্রতিধ্বনিযুক্ত। সেই উত্স কোডটিতে পার্সার পাশাপাশি অপকড হ্যান্ডলারগুলিও জড়িত। শূন্য সংখ্যা প্রদর্শন করার মতো একটি সাধারণ ক্রিয়া বিবেচনা করুন। আপনি ইকো ব্যবহার করুন বা মুদ্রণ করুন না কেন, একই হ্যান্ডলারটি "ZEND_ECHO_SPEC_CONST_HANDLER" ডাকা হবে। প্রিন্টের জন্য হ্যান্ডলার একটি কাজ করে এটি ইকোটির জন্য হ্যান্ডলারটিকে আহ্বান করার আগে এটি নিশ্চিত করে যে মুদ্রণের জন্য ফেরতের মান 1 হবে:
ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
( রেফারেন্সের জন্য এখানে দেখুন )
শর্তাধীন অভিব্যক্তিতে মুদ্রণটি ব্যবহার করতে ইচ্ছুক হওয়াতে প্রত্যাবর্তন মানটি একটি সুবিধা। কেন 1 এবং 100 নয়? ঠিক পিএইচপি-তে 1 বা 100 এর সত্যতা একই, অর্থাৎ সত্য, যেখানে 0 বুলিয়ান প্রসঙ্গে একটি মিথ্যা মান হিসাবে সমান হয়। পিএইচপি-তে সমস্ত অ-শূন্য মান (ধনাত্মক এবং negativeণাত্মক) সত্যবাদী মান এবং এটি পিএইচপি-র পার্ল উত্তরাধিকার থেকে প্রাপ্ত।
তবে, যদি এটি হয় তবে কেউ ভাবতে পারেন কেন প্রতিধ্বনি একাধিক যুক্তি গ্রহণ করে তবে মুদ্রণ কেবল একটিটিকেই পরিচালনা করতে পারে। এই উত্তরের জন্য আমাদেরকে পার্সার, বিশেষত ফাইল zend_language_parser.y চালু করতে হবে । আপনি নোট করবেন যে প্রতিধ্বনিতে স্বাচ্ছন্দ্য রয়েছে যাতে এটি এক বা একাধিক এক্সপ্রেশন মুদ্রণ করতে পারে ( এখানে দেখুন )। যদিও মুদ্রণ কেবলমাত্র একটি এক্সপ্রেশন মুদ্রণ করতে সীমাবদ্ধ ( সেখানে দেখুন )।
বাক্য গঠন
সি প্রোগ্রামিং ভাষা এবং পিএইচপি এর মতো প্রভাবিত ভাষাগুলিতে বিবৃতি এবং অভিব্যক্তির মধ্যে পার্থক্য রয়েছে। সিন্ট্যাক্টিক্যালি, echo expr, expr, ... exprএটি একটি বিবৃতি যখন print exprএকটি অভিব্যক্তি, যেহেতু এটি কোনও মূল্যকে মূল্যায়ন করে। অতএব, অন্যান্য বিবৃতিগুলির মতো, echo exprএটি নিজেই দাঁড়িয়ে এবং একটি অভিব্যক্তিতে অন্তর্ভুক্তিতে অক্ষম:
5 + echo 6; // syntax error
বিপরীতে,, print exprএকা বিবৃতি গঠন করতে পারে:
print 5; // valid
বা, একটি এক্সপ্রেশন অংশ হতে:
$x = (5 + print 5); // 5
var_dump( $x ); // 6
কেউ ভাবতে প্ররোচিত হতে পারে printযেন এটি একটি অযাচিত অপারেটর, যেমন !বা ~তবে এটি অপারেটর নয়। কি !, ~ and printকমন আছে তারা সব পিএইচপি এর মধ্যে নির্মাণ হয় এবং প্রতিটি শুধুমাত্র একটি যুক্তি লাগে। আপনি printনিম্নলিখিত অদ্ভুত কিন্তু বৈধ কোড তৈরি করতে ব্যবহার করতে পারেন :
<?php
print print print print 7; // 7111
প্রথম নজরে ফলাফলটি অদ্ভুত বলে মনে হতে পারে যে শেষ মুদ্রণ বিবৃতিটি তার প্রথমে '7' এর অপরেন্ড মুদ্রণ করে । তবে, যদি আপনি আরও গভীর খনন করেন এবং সত্যিকারের অপকডগুলিতে লক্ষ্য করেন তবে তা বোঝা যায়:
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > PRINT ~0 7
1 PRINT ~1 ~0
2 PRINT ~2 ~1
3 PRINT ~3 ~2
4 FREE ~3
5 > RETURN 1
যে প্রথম প্রথম অপকোড উত্পন্ন হয় তা হ'ল 'প্রিন্ট 7' এর সাথে সম্পর্কিত। '~ 0' একটি অস্থায়ী পরিবর্তনশীল যার মান 1। এটি পরিবর্তনশীল হয়ে ওঠে এবং পরবর্তী মুদ্রণ অপকোডের জন্য অপারেন্ড হয় যার ফলস্বরূপ একটি অস্থায়ী পরিবর্তনশীল ফিরে আসে এবং প্রক্রিয়া পুনরাবৃত্তি হয়। শেষ অস্থায়ী ভেরিয়েবলটি তেমন ব্যবহার হয় না, এটি মুক্ত হয়।
কেন printএকটি মান ফেরত দেয় এবং echoদেয় না?
অভিব্যক্তিগুলি মানগুলিতে মূল্যায়ন করে। উদাহরণস্বরূপ 2 + 3মূল্যায়ণ 5, এবং abs(-10)মূল্যায়ন 10। যেহেতু print exprনিজেই একটি অভিব্যক্তি, সুতরাং এটির একটি মান রাখা উচিত এবং এটি করে, এর একটি ধারাবাহিক মান 1সত্যবাদী ফলাফলকে নির্দেশ করে এবং একটি শূন্য-মান ফিরিয়ে দিয়ে অভিব্যক্তিটি অন্য কোনও অভিব্যক্তিতে অন্তর্ভুক্তির জন্য দরকারী হয়ে ওঠে। উদাহরণস্বরূপ এই স্নিপেটে, মুদ্রণের ফিরতি মান কোনও ফাংশন ক্রম নির্ধারণে কার্যকর:
<?php
function bar( $baz ) {
// other code
}
function foo() {
return print("In and out ...\n");
}
if ( foo() ) {
bar();
}
উড়ানের ডিবাগিংয়ের ক্ষেত্রে আপনি কোনও নির্দিষ্ট মানের মুদ্রণ পেতে পারেন, যেমন পরবর্তী উদাহরণটি বর্ণনা করেছে:
<?php
$haystack = 'abcde';
$needle = 'f';
strpos($haystack,$needle) !== FALSE OR print "$needle not in $haystack";
// output: f not in abcde
পার্শ্ব-নোট হিসাবে, সাধারণত, বিবৃতি প্রকাশ নয়; তারা কোনও মূল্য ফেরায় না ব্যতিক্রম অবশ্যই 1;হ'ল এক্সপ্রেশন স্টেটমেন্ট যা মুদ্রণ এবং এমনকি স্টেটমেন্ট হিসাবে ব্যবহৃত সাধারণ অভিব্যক্তি ব্যবহার করে, যেমন একটি সিনট্যাক্স যা পিএইচপি সি থেকে উত্তরাধিকার সূত্রে প্রকাশ করে তা এক্সপ্রেশন বিবৃতিটি দেখতে অদ্ভুত লাগতে পারে তবে এটি খুব সহায়ক, এতে যুক্তিগুলি পাস করা সম্ভব হয় to ফাংশন।
কি printএকটি ফাংশন?
না, এটি একটি ভাষা নির্মাণ। সমস্ত ফাংশন কলগুলি এক্সপ্রেশন print (expr)হলেও এটি একটি অভিব্যক্তি, ভিজ্যুয়াল থাকা সত্ত্বেও এটি ফাংশন কল সিনট্যাক্স ব্যবহার করে বলে মনে হয়। সত্যিকার অর্থে এই বন্ধনীগুলি হল বন্ধনী-এক্সপ্রেস সিনট্যাক্স, যা এক্সপ্রেশন মূল্যায়নের জন্য দরকারী for এটি এই সত্যটির জন্য অ্যাকাউন্ট করে যে মাঝে মাঝে তারা expressionচ্ছিক হয় যদি অভিব্যক্তিটি সরল থাকে যেমন print "Hello, world!"। আরও জটিল মত প্রকাশের সাথে যেমন print (5 ** 2 + 6/2); // 28বন্ধনীগুলি এক্সপ্রেশনটির মূল্যায়নে সহায়তা করে। ফাংশন নামের থেকে পৃথক, printসিনথেটিকভাবে একটি কীওয়ার্ড এবং শব্দার্থগতভাবে একটি "ভাষা গঠন" ।
পিএইচপি-তে "ভাষা নির্মাণ" শব্দটি সাধারণত "সিউডো" ফাংশনগুলিকে বোঝায় issetবা এর মতো empty। যদিও এই "কনস্ট্রাক্ট "গুলি হ'ল ফাংশনগুলির মতো দেখায় তবে এগুলি প্রকৃতপক্ষে ফিপ্পার্স (অর্থাত্) যুক্তিগুলি মূল্যায়ন না করেই তাদের কাছে প্রেরণ করা হয়, যার জন্য সংকলক থেকে বিশেষ চিকিত্সা প্রয়োজন। printএটি এমন একটি ফিক্সপ্রিপ হয়ে যায় যা তার যুক্তিটিকে ফাংশন হিসাবে একইভাবে মূল্যায়ন করতে পছন্দ করে।
পার্থক্যটি মুদ্রণের মাধ্যমে দেখা যায় get_defined_functions(): কোনও printফাংশন তালিকাভুক্ত নেই। (যদিও printfবন্ধু এবং বন্ধুরা: এর বিপরীতে printএগুলি প্রকৃত ফাংশন))
মুদ্রণ (ফু) তখন কাজ করে কেন?
একই কারণে যে echo(foo)কাজ করে। এই বন্ধনীগুলি ফাংশন কল বন্ধনীগুলির থেকে একেবারেই আলাদা কারণ তারা পরিবর্তে প্রকাশের সাথে সম্পর্কিত। এজন্যই কেউ কোড করতে পারে echo ( 5 + 8 )এবং ১৩ টির ফলাফল প্রদর্শিত হতে পারে ( রেফারেন্স দেখুন )। এই প্রথম বন্ধনীগুলি কোনও ক্রিয়াকলাপের পরিবর্তে কোনও অভিব্যক্তি মূল্যায়নের সাথে জড়িত। দ্রষ্টব্য: পিএইচপি-তে বন্ধনীগুলির জন্য অন্যান্য ব্যবহার রয়েছে, যেমন- যদি শর্তযুক্ত অভিব্যক্তি, অ্যাসাইনমেন্ট তালিকা, ফাংশন ঘোষণা ইত্যাদি if
সিনট্যাক্স ত্রুটিতে কেন print(1,2,3)এবং echo(1,2,3)ফলাফল হয়?
বাক্য গঠনটি হ'ল print expr, echo exprবা echo expr, expr, ..., expr। যখন পিএইচপি এর মুখোমুখি হয় (1,2,3), এটি এটিকে একটি একক অভিব্যক্তি হিসাবে বিশ্লেষণ করার চেষ্টা করে এবং ব্যর্থ হয়, কারণ সি এর বিপরীতে, পিএইচপি-তে সত্যিই বাইনারি কমা অপারেটর থাকে না; কমা বিভাজক হিসাবে আরও পরিবেশন করে। (পিএইচপি-র লুপগুলিতে আপনি বাইনারি কমা খুঁজে পেতে পারেন, সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সিনট্যাক্স)
শব্দার্থবিদ্যা
বিবৃতিটি echo e1, e2, ..., eN;সিনট্যাকটিক চিনির হিসাবে বোঝা যায় echo e1; echo e2; ...; echo eN;।
যেহেতু সমস্ত অভিব্যক্তি বিবৃতি, এবং echo eসর্বদা একই পার্শ্ব-প্রতিক্রিয়া থাকে print eএবং print eবিবৃতি হিসাবে ব্যবহার করার সময় এর রিটার্ন মানটিকে অগ্রাহ্য করা হয়, তাই আমরা echo eসিনট্যাকটিক চিনির হিসাবে বুঝতে পারি print e।
এই দুটি পর্যবেক্ষণটির অর্থ echo e1, e2, ..., eN;সিনট্যাকটিক চিনি হিসাবে দেখা যেতে পারে print e1; print e2; ... print eN;। (তবে, নীচের অ-শব্দার্থিক রানটাইম পার্থক্যগুলি নোট করুন))
সুতরাং আমরা কেবল শব্দার্থবিদ্যা সংজ্ঞায়িত করতে হবে print। print e, যখন মূল্যায়ন করা হয়:
- এর একক যুক্তি মূল্যায়ন করে
eএবং ফলাফলটিকে একটি স্ট্রিতে টাইপ করে s। (সুতরাং, print eসমান print (string) e।)
- স্ট্রিং প্রবাহের
sজন্য আউটপুট বাফার (যা শেষ পর্যন্ত মানক আউটপুটে প্রবাহিত হতে হবে)।
- পূর্ণসংখ্যার দিকে মূল্যায়ন করে
1।
বাইটকোড স্তরে পার্থক্য
print রিটার্ন ভেরিয়েবলের পপুলেশন করার একটি ছোট ওভারহেড জড়িত (সিউডোকোড)
print 125;
PRINT 125,$temp ; print 125 and place 1 in $temp
UNSET $temp ; remove $temp
এককটি echoএকটি অপকোডে সংকলন করে:
echo 125;
ECHO 125
echoএকাধিক অপকডে বহু-মান সংকলন করে
echo 123, 456;
ECHO 123
ECHO 456
নোট করুন যে মাল্টি-ভ্যালু echoতার যুক্তিগুলিকে একত্রিত করে না, তবে তাদের একের পর এক আউটপুট দেয়।
তথ্যসূত্র: zend_do_print, zend_do_echo।
রানটাইম পার্থক্য
ZEND_PRINT নিম্নলিখিত হিসাবে প্রয়োগ করা হয় (সিউডোকোড)
PRINT var, result:
result = 1
ECHO var
সুতরাং এটি মূলত 1ফলাফলের পরিবর্তনশীল রাখে এবং ZEND_ECHOহ্যান্ডলারের কাছে আসল কাজটি অর্পণ করে । ZEND_ECHOনিম্নলিখিত না
ECHO var:
if var is object
temp = var->toString()
zend_print_variable(temp)
else
zend_print_variable(var)
যেখানে zend_print_variable()প্রকৃত "মুদ্রণ" সম্পাদন করে (প্রকৃতপক্ষে, এটি নিছক একটি উত্সর্গীকৃত SAPI ফাংশনটিতে পুনঃনির্দেশ করে)।
গতি: echo xবনামprint x
প্রতিধ্বনির বিপরীতে , মুদ্রণ একটি অস্থায়ী পরিবর্তনশীল বরাদ্দ করে। তবে এই ক্রিয়াকলাপে যে পরিমাণ সময় ব্যয় করা হয়েছে তা বিয়োগাত্মক, সুতরাং এই দুটি ভাষা নির্মানের মধ্যে পার্থক্য নগণ্য।
গতি: echo a,b,cবনামecho a.b.c
প্রথমটি তিনটি পৃথক বিবৃতি সংকলন করে। দ্বিতীয়টি পুরো ভাবটি মূল্যায়ন করে a.b.c., ফলাফলটি মুদ্রণ করে এবং তা সঙ্গে সঙ্গে তা নিষ্পত্তি করে। যেহেতু কনটেন্টেশন মেমরির বরাদ্দ এবং অনুলিপি জড়িত, প্রথম বিকল্পটি আরও কার্যকর হবে।
তাহলে কোনটি ব্যবহার করবেন?
ওয়েব অ্যাপ্লিকেশনগুলিতে, আউটপুট বেশিরভাগ টেম্পলেটগুলিতে কেন্দ্রীভূত হয়। যেহেতু টেমপ্লেটগুলি ব্যবহার করে <?=, echoএটির নামটি , তাই echoকোডের অন্যান্য অংশগুলিতেও এটি যুক্তিযুক্ত মনে হয় । echoতাদের একচেটিয়া না জানিয়ে একাধিক এক্সপ্রেশন মুদ্রণ করতে সক্ষম হওয়ার অতিরিক্ত সুবিধা রয়েছে এবং অস্থায়ী রিটার্ন ভেরিয়েবলের পপুলেশন করার ওভারহেড জড়িত না। সুতরাং, ব্যবহার করুন echo।