স্ট্রাইটে কনটেন্টেট না করে ধ্রুবক অন্তর্ভুক্ত করুন


166

পিএইচপি-তে কোনও যুক্তি ছাড়াই স্ট্রিংয়ের ধ্রুবক অন্তর্ভুক্ত করার কোনও উপায় আছে?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

12
অন্তর্দৃষ্টি আমাকে বলে যে "এটি আমার ধ্রুবক: {MY_CONSTANT}" কাজ করা উচিত। এটা হয় না। শুধু এই এখানে কেস কেউ মনে করে একই আই যেমন নির্বাণ
Mikael Lindqvist

উত্তর:


148

না।

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

constant() একটি ধ্রুবক ধরে রাখার বিকল্প উপায়, তবে কোনও ফাংশন কলকে কনটেন্টেশন ছাড়া স্ট্রিংয়ে রাখা যায় না।

পিএইচপি-র স্থির উপর ম্যানুয়াল


1
নিঃসন্দেহে এটি সঠিক উত্তর হিসাবে +1 করুন। প্রথমে আমি আপনার মতোই লিখতে চেয়েছিলাম, তবে আপনার পড়ার পরে, আমি ভেবেছিলাম আমাকে আলাদা কিছু উপস্থাপন করতে হবে;)
ফেলিক্স ক্লিং

3
হে হে! তবে সৃজনশীলতার জন্য সবার জন্য একটি ভাল প্রাপ্য +1। :)
পেক্কা

59
"ফাংশন কলটিকে স্ট্রিংয়ে রাখা যায় না" হ্যাঁ এটি হতে পারে:define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
রাভেরেন

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

4
আমি কেবল এটি সম্ভব দেখিয়েছি, কোন উপায়ে আরও ভাল সে সম্পর্কে মন্তব্য করা হয়নি।
রাভেরেন

111

হ্যাঁ এটি (কোনও উপায়ে;)):

define('FOO', 'bar');

$test_string = sprintf('This is a %s test string', FOO);

এটি সম্ভবত আপনি টার্গেট করে যাচ্ছিলেন তা নয়, তবে আমি মনে করি, প্রযুক্তিগতভাবে এটি সংক্ষিপ্তকরণ নয় বরং একটি প্রতিস্থাপন এবং এই অনুমান থেকে, এটি বিনা বাক্যে স্ট্রিংয়ের একটি ধ্রুবককে অন্তর্ভুক্ত করে


5
@Pekka: আমি :-D (ঠিক এই সময় ...;) জানি)
ফেলিক্স Kling

1
:) @ juraj.blahunka এর পদ্ধতিকে আরও চটকদার। এটি চিঠির মাধ্যমে প্রশ্নের উত্তর দেয়, তবে এর আত্মা নয়। :)
পেক্কা

2
@ ব্লাহাঙ্কা: সুন্দর বক্তব্য আমরা সম্ভবত এটি প্রতিদিন ব্যবহার করি
আলফাব্রভো

57

স্ট্রিংগুলির মধ্যে ধ্রুবকগুলি ব্যবহার করতে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

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 )}" ); 

মনে রেখ

এই অনুশীলনটি অ-পরামর্শযুক্ত, তবে কখনও কখনও ফলাফলগুলি আরও বেশি পঠনযোগ্য কোডের ফলাফল করে, তাই এটি আপনার উপর নির্ভর করে - সম্ভাবনা রয়েছে।


1
এটি একটি দুর্দান্ত কৌশল! অন্যান্য উত্তরগুলির মতো, চেষ্টা এবং পাঠযোগ্যতার দিক থেকে কনকনটেইনেশনের উপর সত্যই বড় জয় নয়, তবে তা জেনে ভাল। আপনি যখন এমন কিছু করেন তখন এটি আরও যৌন হয় $_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"। থেটাইকোর সংস্করণ উদ্ধৃতিগুলির প্রয়োজনীয়তা সরিয়ে দেয় এবং একটি আন্ডারস্কোরটি সুন্দর।
বেজোর

2
আমি এটি কোনও টেম্পলেট ইঞ্জিন তৈরির জন্য দরকারী বলে দেখতে পেলাম, তবে এটি ব্যবহার করা আসলে খুব স্পর্শকাতর বলে মনে হচ্ছে।
Mnebuerquo

21
define( 'FOO', 'bar');  
$FOO = FOO;  
$string = "I am too lazy to concatenate $FOO in my string";

4
এটিই আমি সবচেয়ে বেশি ব্যবহার করি, যখন আমার কাছে রচনা করার জন্য একগুচ্ছ পাগল এসকিউএল স্ট্রিং থাকে। এছাড়াও ... প্যাসিভ-আক্রমণাত্মক অনেক? ;-)
বেজোর

2
অপ্রয়োজনীয় দেখতে ব্যয় করে এই একের কমপক্ষে যাদু রয়েছে
BrDaHa

দুর্দান্ত সমাধান। সহজ এবং দ্রুত।
রজার হিল

14
define('FOO', 'bar');
$constants = create_function('$a', 'return $a;');
echo "Hello, my name is {$constants(FOO)}";

13

আপনি যদি সত্যই কনটেন্টেশন ছাড়াই ধ্রুব প্রতিধ্বনিত করতে চান তবে সমাধানটি এখানে রয়েছে:

define('MY_CONST', 300);
echo 'here: ', MY_CONST, ' is a number';

দ্রষ্টব্য : এই উদাহরণে প্রতিধ্বনি অনেকগুলি পরামিতি নেয় ( কমাগুলি দেখুন ), সুতরাং এটি আসল উপসংহার নয়

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

সম্পাদনা

এছাড়াও যদি আপনি বিবেচনা concatenating যেমন স্ট্রিং, passings স্ট্রিং প্যারামিটার বা লেখার দিয়ে পুরো স্ট্রিং " , , (কমা সংস্করণ) সবসময় দ্রুততম, পরবর্তী যায় (সঙ্গে সংযুক্তকরণের ' একক উদ্ধৃতি) এবং ধীরতম স্ট্রিং নির্মাণের পদ্ধতি উদ্ধৃতি চিহ্ন ব্যবহার করা হয় " , কারণ এইভাবে লেখা এক্সপ্রেশনকে ঘোষিত ভেরিয়েবল এবং ফাংশনগুলির বিরুদ্ধে মূল্যায়ন করতে হবে ..


11

আপনি করতে পারেন:

define( 'FOO', 'bar' );

$constants = get_defined_constants(true); // the true argument categorizes the constants
$constants = $constants[ 'user' ]; // this gets only user-defined constants

echo "Hello, my name is {$constants['FOO']}";

6

সবচেয়ে সহজ উপায়

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;

আমি এটিকে একটি ভাল সমাধান হিসাবে বিবেচনা করি। কিছু ক্ষেত্রে, সরাসরি কন্টেন্ট ব্যবহার করা হলে সংযুক্ত স্ট্রিং কাজ করবে না।
কেটি

5

অন্যরা যেমন নির্দেশ করেছে আপনি এটি করতে পারবেন না। পিএইচপি এর একটি ফাংশন রয়েছে constant()যা সরাসরি স্ট্রিংয়ে ডাকা যায় না তবে আমরা সহজেই এটিকে ঘিরে কাজ করতে পারি।

$constant = function($cons){
   return constant($cons);
};

এবং এর ব্যবহারের একটি প্রাথমিক উদাহরণ:

define('FOO', 'Hello World!');
echo "The string says {$constant('FOO')}"; 

আপনি $constant = 'constant';অন্য ফাংশনটি সংজ্ঞায়নের পরিবর্তে কেবল করতে পারেন , এবং এটি ফাংশনটি ইতিমধ্যে বিদ্যমান থাকার কারণে এটি একইরূপে কাজ করবে।
redreinard

2

এখানে অন্যান্য উত্তরের কয়েকটি বিকল্প রয়েছে, যা বেশিরভাগ "{$}" কৌতুকের দিকে মনোনিবেশ করা বলে মনে হচ্ছে। যদিও তাদের গতিতে কোনও গ্যারান্টি দেওয়া হয় না; এটি সমস্ত খাঁটি সিনট্যাকটিক চিনি। এই উদাহরণগুলির জন্য, আমরা ধরে নেব যে নীচের ধাপগুলির সেটটি সংজ্ঞায়িত করা হয়েছিল।

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 );

আপনি চাইলে যে কোনও প্রতিস্থাপন টোকেন ব্যবহার করতে পারেন,% বা # এর মতো। টাইপ করা কিছুটা সহজ হওয়ায় আমি এখানে স্ল্যাশ ব্যবহার করেছি।


0

মজার বিষয় হল আপনি নামের জায়গার জঞ্জাল রোধ করতে আপনার ফাংশনটির নাম হিসাবে 'কনস্ট' শব্দটি ব্যবহার করতে পারেন:

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;};

ভবিষ্যতের ব্যবহারের জন্য এটি নিরাপদ। এবং আরও খারাপ - এটি এখনও কুরুচিপূর্ণ দেখাচ্ছে।


-2

আমি বিশ্বাস করি এটি অপার মূল প্রশ্নের উত্তর দেয়। একমাত্র বিষয় হ'ল গ্লোবালস সূচক কীটি কেবল ছোট হাতের কাজ হিসাবে কাজ করে।

define('DB_USER','root');
echo "DB_USER=$GLOBALS[db_user]";

আউটপুট:

DB_USER=root

1
এটি কাজ করে না বলে মনে হচ্ছে (আপনি যদি একটানা বড় হাতের অক্ষর ব্যবহার করেন তবেও) LO গ্লোবালগুলি an associative array containing references to all variables
har-wradim

এই উত্তরটি ভুল। আপনার আউটপুট থেকে অন্য কোথাও যদি আপনিও থাকতে পারেন তবে এটি সম্ভবত আউটপুট উত্পাদন করতে পারে$db_user = 'root';
জেফ পেকেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.