তথ্যসূত্র: পিএইচপি এর মুদ্রণ এবং প্রতিধ্বনির তুলনা করা


182

পিএইচপি printএবং এর মধ্যে পার্থক্য কী echo?

স্ট্যাক ওভারফ্লো পিএইচপি এর printএবং echoকীওয়ার্ড ব্যবহার সম্পর্কে জিজ্ঞাসা অনেক প্রশ্ন আছে ।

এই পোস্টের উদ্দেশ্য হ'ল পিএইচপি এবং কীওয়ার্ডগুলি সম্পর্কে একটি প্রমিত রেফারেন্স প্রশ্ন এবং উত্তর সরবরাহ করা এবং তাদের পার্থক্য এবং ব্যবহারের ক্ষেত্রে তুলনা করা।printecho


3
আমি মনে করি এখানে মুদ্রণ ফেরতের মান সম্পর্কে যথেষ্ট নয়। মুদ্রণটি দ্রুত ডিবাগ আউটপুট বা এর মতো কোনও কিছুর জন্য কার্যকর str স্ট্রপস ($ x, $ y)! == মিথ্যা বা "কিছু" মুদ্রণ করুন। টাইপ টু টাইপ এবং পড়া ভাল। এবং "ইজ প্রিন্ট অফ ফাংশন" কোনও কারণে পড়ার জন্য বিশ্রী ছিল (আপনার যুক্তিটি মনে হচ্ছে ... অদ্ভুত এবং স্পষ্ট নয়) - এটি ভাষা গঠন, এটির সাথে আরও খারাপ জিনিস আপনি করতে পারবেন না: পরিবর্তনশীল ফাংশন।
XzKto

1
এখানে কী করা দরকার তা খোলা রাখার জন্য হ'ল: ১. প্রশ্নোত্তরে বিভক্ত। ২. স্ট্যাক ওভারফ্লো সম্পর্কিত বিষয় সম্পর্কে বিদ্যমান সামগ্রীর রেফারেন্স / লিঙ্ক (দয়া করে এখানে এখানে পছন্দ করুন: stackoverflow.com/questions/3737139/… ) তবে উত্তরে। 3. সিডব্লিউ হতে হবে।
কেভ

"সম্পর্কিত কলাম" ঠিক আছে, তবে এটি খুব বেশি কেন্দ্রীভূত নয়। ক্যানোনিকাল রেফারেন্স প্রশ্ন এবং উত্তর হিসাবে এর মান বাড়ানোর জন্য এটিরও ভাল গবেষণা করা উচিত এবং অন্যান্য নির্দিষ্ট ভাল উত্তরের লিঙ্কগুলি মান যুক্ত করবে।
কেভ

প্রশ্নটি আসলেই একটি আসল প্রশ্ন হওয়া দরকার । আপনার কাজ শেষ হয়ে গেলে আমি ক্যানোনিকাল অংশ সম্পর্কিত এটিতে একটি ব্যানার যুক্ত করতে পারি।
টিম পোস্ট

উত্তর:


185

দুটি কনস্ট্রাক্ট কেন?

মুদ্রণ এবং প্রতিধ্বনির সত্যতা হ'ল তারা যখন ব্যবহারকারীদের কাছে দুটি স্বতন্ত্র নির্মান হিসাবে উপস্থিত হয়, আপনি যদি বেসিকগুলিতে অবতীর্ণ হন তবে তারা অভ্যন্তরীণ উত্স কোডটি দেখুন তবে এগুলি উভয়ই সত্যই প্রতিধ্বনিযুক্ত। সেই উত্স কোডটিতে পার্সার পাশাপাশি অপকড হ্যান্ডলারগুলিও জড়িত। শূন্য সংখ্যা প্রদর্শন করার মতো একটি সাধারণ ক্রিয়া বিবেচনা করুন। আপনি ইকো ব্যবহার করুন বা মুদ্রণ করুন না কেন, একই হ্যান্ডলারটি "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;। (তবে, নীচের অ-শব্দার্থিক রানটাইম পার্থক্যগুলি নোট করুন))

সুতরাং আমরা কেবল শব্দার্থবিদ্যা সংজ্ঞায়িত করতে হবে printprint e, যখন মূল্যায়ন করা হয়:

  1. এর একক যুক্তি মূল্যায়ন করে eএবং ফলাফলটিকে একটি স্ট্রিতে টাইপ করে s। (সুতরাং, print eসমান print (string) e।)
  2. স্ট্রিং প্রবাহের sজন্য আউটপুট বাফার (যা শেষ পর্যন্ত মানক আউটপুটে প্রবাহিত হতে হবে)।
  3. পূর্ণসংখ্যার দিকে মূল্যায়ন করে 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


5
আমি এটি ব্যাপকভাবে সম্পাদনা করেছি এবং স্পষ্ট করে দিয়েছি এবং শব্দার্থবিজ্ঞানের উপর একটি বিভাগ যুক্ত করেছি। আমি এটি সম্পর্কে মোটামুটি আত্মবিশ্বাসী, তবে কেউ এটি পরীক্ষা করতে পারে।
জামেসফিশার

1
তার মানে কি, তাহলে echo $a,$b,$cস্ট্রিং ওয়ারগুলি সংমিশ্রনের জন্য ব্যবহার করা ভাল ? আমি সত্যই এটিকে ব্যবহারে দেখিনি।
জিওফ

1
কার্যকরী পার্থক্য বর্ণনা করে একটি টিএল; ডিআর বিভাগ সম্পর্কে কীভাবে? পছন্দ: printকেবলমাত্র একটি আর্গুমেন্ট অনুমতি দেয়, echoএকাধিক থাকতে পারে; echoকরতে পারার সময় printএবং এক্সপ্রেশনটির একটি অংশ হতে পারে না ...; এবং কিছু পারফরম্যান্স সারাংশ হতে পারে। এবং তার পরে সমস্ত "কেন" এবং "হুডের নীচে" অংশগুলি রয়েছে
ইয়াকোভএল

0

আমি জানি আমি দেরি করে ফেলেছি তবে একটি জিনিস আমি যুক্ত করতে চাই তা হ'ল আমার কোডটি

 $stmt = mysqli_stmt_init($connection) or echo "error at init"; 

একটি ত্রুটি দেয় "সিনট্যাক্স ত্রুটি, অপ্রত্যাশিত 'ইকো' (T_ECHO)"

যখন

 $stmt = mysqli_stmt_init($connection) or print "error at init";

ঠিকভাবে কাজ করে.

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

কেউ যদি এই আচরণ সম্পর্কে কিছুটা আলোকপাত করতে পারে তবে আমি খুশি হব।

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