পিএইচপি-তে কোনও যুক্তি ছাড়াই স্ট্রিংয়ের ধ্রুবক অন্তর্ভুক্ত করার কোনও উপায় আছে?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
পিএইচপি-তে কোনও যুক্তি ছাড়াই স্ট্রিংয়ের ধ্রুবক অন্তর্ভুক্ত করার কোনও উপায় আছে?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
উত্তর:
না।
স্ট্রিংগুলির সাথে, পিএইচপি-র জন্য ধ্রুবক শনাক্তকারীদের বাদ দিয়ে স্ট্রিং ডেটা বলার উপায় নেই। এটি হেরডোক সহ পিএইচপি-র যে কোনও স্ট্রিং ফর্ম্যাটের জন্য যায়।
constant()
একটি ধ্রুবক ধরে রাখার বিকল্প উপায়, তবে কোনও ফাংশন কলকে কনটেন্টেশন ছাড়া স্ট্রিংয়ে রাখা যায় না।
define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
হ্যাঁ এটি (কোনও উপায়ে;)):
define('FOO', 'bar');
$test_string = sprintf('This is a %s test string', FOO);
এটি সম্ভবত আপনি টার্গেট করে যাচ্ছিলেন তা নয়, তবে আমি মনে করি, প্রযুক্তিগতভাবে এটি সংক্ষিপ্তকরণ নয় বরং একটি প্রতিস্থাপন এবং এই অনুমান থেকে, এটি বিনা বাক্যে স্ট্রিংয়ের একটি ধ্রুবককে অন্তর্ভুক্ত করে ।
স্ট্রিংগুলির মধ্যে ধ্রুবকগুলি ব্যবহার করতে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:
define( 'ANIMAL', 'turtles' );
$constant = 'constant';
echo "I like {$constant('ANIMAL')}";
যে কোনও ফাংশনের নাম ভেরিয়েবলে রাখতে এবং ডাবল-কোটড স্ট্রিংয়ের মধ্যে প্যারামিটারগুলির সাথে কল করতে পারে। একাধিক পরামিতিগুলির সাথেও কাজ করে।
$fn = 'substr';
echo "I like {$fn('turtles!', 0, -1)}";
উত্পাদন
আমি কচ্ছপ পছন্দ করি
আপনি বেনামে ফাংশন ব্যবহার করতে পারেন তবে আপনি পিএইচপি 5.3+ চালিয়ে যাচ্ছেন।
$escape = function ( $string ) {
return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
প্রত্যাশা অনুযায়ী সঠিকভাবে পালিয়ে আসা এইচটিএমএল উত্পাদন করে।
যদি এখন আপনি এই ধারণাটির আওতায় রয়েছেন যে ফাংশনটির নামটি কোনও কলযোগ্য হতে পারে, তবে এটি ঠিক নয়, এমন একটি অ্যারের হিসাবে যখন সত্যিকার অর্থে ফিরে আসে যখন is_callable
কোনও স্ট্রিংয়ের অভ্যন্তরে ব্যবহৃত হলে মারাত্মক ত্রুটি ঘটায়:
class Arr
{
public static function get( $array, $key, $default = null )
{
return is_array( $array ) && array_key_exists( $key, $array )
? $array[$key]
: $default;
}
}
$fn = array( 'Arr', 'get' );
var_dump( is_callable( $fn ) ); // outputs TRUE
// following line throws Fatal error "Function name must be a string"
echo( "asd {$fn( array( 1 ), 0 )}" );
এই অনুশীলনটি অ-পরামর্শযুক্ত, তবে কখনও কখনও ফলাফলগুলি আরও বেশি পঠনযোগ্য কোডের ফলাফল করে, তাই এটি আপনার উপর নির্ভর করে - সম্ভাবনা রয়েছে।
$_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"
। থেটাইকোর সংস্করণ উদ্ধৃতিগুলির প্রয়োজনীয়তা সরিয়ে দেয় এবং একটি আন্ডারস্কোরটি সুন্দর।
define( 'FOO', 'bar');
$FOO = FOO;
$string = "I am too lazy to concatenate $FOO in my string";
আপনি যদি সত্যই কনটেন্টেশন ছাড়াই ধ্রুব প্রতিধ্বনিত করতে চান তবে সমাধানটি এখানে রয়েছে:
define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';
দ্রষ্টব্য : এই উদাহরণে প্রতিধ্বনি অনেকগুলি পরামিতি নেয় ( কমাগুলি দেখুন ), সুতরাং এটি আসল উপসংহার নয়
প্রতিধ্বনি একটি ফাংশন হিসাবে আচরণ করে, এটি আরও বেশি পরামিতি নেয়, এটি কনট্যাকটেশনের চেয়ে বেশি দক্ষ, কারণ এটি সংক্ষিপ্ত করতে হয় না এবং এর পরে প্রতিধ্বনিত হয় না, এটি কেবল নতুন স্ট্রিং কনটেনেটেড অবজেক্ট তৈরির প্রয়োজন ছাড়াই সবকিছু প্রতিধ্বনিত করে :))
সম্পাদনা
এছাড়াও যদি আপনি বিবেচনা concatenating যেমন স্ট্রিং, passings স্ট্রিং প্যারামিটার বা লেখার দিয়ে পুরো স্ট্রিং " , , (কমা সংস্করণ) সবসময় দ্রুততম, পরবর্তী যায় । (সঙ্গে সংযুক্তকরণের ' একক উদ্ধৃতি) এবং ধীরতম স্ট্রিং নির্মাণের পদ্ধতি উদ্ধৃতি চিহ্ন ব্যবহার করা হয় " , কারণ এইভাবে লেখা এক্সপ্রেশনকে ঘোষিত ভেরিয়েবল এবং ফাংশনগুলির বিরুদ্ধে মূল্যায়ন করতে হবে ..
সবচেয়ে সহজ উপায়
define('MY_CONSTANT', 42);
$my_constant = MY_CONSTANT;
echo "This is my constant: $my_constant";
অন্য উপায় ব্যবহার (s)printf
define('MY_CONSTANT', 42);
// Note that %d is for numeric values. Use %s when constant is a string
printf('This is my constant: %d', MY_CONSTANT);
// Or if you want to use the string.
$my_string = sprintf('This is my constant: %d', MY_CONSTANT);
echo $my_string;
অন্যরা যেমন নির্দেশ করেছে আপনি এটি করতে পারবেন না। পিএইচপি এর একটি ফাংশন রয়েছে constant()
যা সরাসরি স্ট্রিংয়ে ডাকা যায় না তবে আমরা সহজেই এটিকে ঘিরে কাজ করতে পারি।
$constant = function($cons){
return constant($cons);
};
এবং এর ব্যবহারের একটি প্রাথমিক উদাহরণ:
define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}";
$constant = 'constant';
অন্য ফাংশনটি সংজ্ঞায়নের পরিবর্তে কেবল করতে পারেন , এবং এটি ফাংশনটি ইতিমধ্যে বিদ্যমান থাকার কারণে এটি একইরূপে কাজ করবে।
এখানে অন্যান্য উত্তরের কয়েকটি বিকল্প রয়েছে, যা বেশিরভাগ "{$}" কৌতুকের দিকে মনোনিবেশ করা বলে মনে হচ্ছে। যদিও তাদের গতিতে কোনও গ্যারান্টি দেওয়া হয় না; এটি সমস্ত খাঁটি সিনট্যাকটিক চিনি। এই উদাহরণগুলির জন্য, আমরা ধরে নেব যে নীচের ধাপগুলির সেটটি সংজ্ঞায়িত করা হয়েছিল।
define( 'BREAD', 'bread' ); define( 'EGGS', 'eggs' ); define( 'MILK', 'milk' );
এক্সট্রাক্ট () ব্যবহার করে
এটি দুর্দান্ত কারণ ফলাফলটি ভেরিয়েবলের সমান। প্রথমে আপনি পুনরায় ব্যবহারযোগ্য ফাংশন তৈরি করুন:
function constants(){ return array_change_key_case( get_defined_constants( true )[ 'user' ] ); }
তারপরে যেকোন সুযোগ থেকে কল করুন:
extract( constants() );
$s = "I need to buy $bread, $eggs, and $milk from the store.";
এখানে, এটি আপনার আঙ্গুলগুলিতে আরও সহজ হওয়ার জন্য ধ্রুবকগুলি হ্রাস করে, তবে আপনি সেগুলি ঠিক রাখার জন্য অ্যারে_চেঞ্জ_কি_সেস () মুছে ফেলতে পারেন। আপনার যদি ইতিমধ্যে বিরোধী স্থানীয় চলক নামগুলি থাকে তবে ধ্রুবকগুলি সেগুলি ওভাররাইড করবে না।
স্ট্রিং প্রতিস্থাপন ব্যবহার করে
এটি স্প্রিন্টফ () এর সমান, তবে একক প্রতিস্থাপন টোকেন ব্যবহার করে এবং সীমাহীন সংখ্যক আর্গুমেন্ট গ্রহণ করে। আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে তবে আমার অসতর্কতা ক্ষমা করুন এবং এর পিছনে থাকা ধারণার দিকে মনোনিবেশ করার চেষ্টা করুন।
আগের মত, আপনি একটি পুনরায় ব্যবহারযোগ্য ফাংশন তৈরি করুন:
function fill(){
$arr = func_get_args(); $s = $arr[ 0 ]; array_shift( $arr );
while( strpos( $s, '/' ) !== false ){
$s = implode( current( $arr ), explode( '/', $s, 2 ) ); next( $arr );
} return $s;
}
তারপরে যেকোন সুযোগ থেকে কল করুন:
$s = fill( 'I need to buy /, /, and / from the store.', BREAD, EGGS, MILK );
আপনি চাইলে যে কোনও প্রতিস্থাপন টোকেন ব্যবহার করতে পারেন,% বা # এর মতো। টাইপ করা কিছুটা সহজ হওয়ায় আমি এখানে স্ল্যাশ ব্যবহার করেছি।
মজার বিষয় হল আপনি নামের জায়গার জঞ্জাল রোধ করতে আপনার ফাংশনটির নাম হিসাবে 'কনস্ট' শব্দটি ব্যবহার করতে পারেন:
define("FOO","foo");
${'const'} = function($a){return $a;};
echo "{$const(FOO)}"; // Prints "foo"
echo const(FOO); // Parse error: syntax error, unexpected T_CONST
আপনি সমস্ত কোডে 'কনস্ট' ফাংশন প্রচার করতে $ গ্লোবালস ব্যবহার করতে পারেন:
$GLOBALS['const'] = function($a){return $a;};
ভবিষ্যতের ব্যবহারের জন্য এটি নিরাপদ। এবং আরও খারাপ - এটি এখনও কুরুচিপূর্ণ দেখাচ্ছে।
আমি বিশ্বাস করি এটি অপার মূল প্রশ্নের উত্তর দেয়। একমাত্র বিষয় হ'ল গ্লোবালস সূচক কীটি কেবল ছোট হাতের কাজ হিসাবে কাজ করে।
define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";
আউটপুট:
DB_USER=root
an associative array containing references to all variables
।
$db_user = 'root';