क्या पीएचपी में एक तरीका है एक कॉन्टैस्ट को बिना स्ट्रिंग में शामिल करने के लिए?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
क्या पीएचपी में एक तरीका है एक कॉन्टैस्ट को बिना स्ट्रिंग में शामिल करने के लिए?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
जवाबों:
नहीं।
स्ट्रिंग्स के साथ, PHP के लिए निरंतर पहचानकर्ताओं के अलावा स्ट्रिंग डेटा को बताने का कोई तरीका नहीं है। यह PHP में किसी भी स्ट्रिंग प्रारूप के लिए जाता है, जिसमें heredoc भी शामिल है।
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)}";
का उत्पादन
मुझे कछुए पसंद हैं
आप अनाम कार्यों का भी उपयोग कर सकते हैं बशर्ते आप PHP 5.3+ चला रहे हों।
$escape = function ( $string ) {
return htmlspecialchars( (string) $string, ENT_QUOTES, 'utf-8' );
};
$userText = "<script>alert('xss')</script>";
echo( "You entered {$escape( $userText )}" );
उम्मीद के मुताबिक HTML से उत्पादन ठीक से बच गया।
यदि अब तक आप इस धारणा के तहत हैं कि फ़ंक्शन नाम किसी भी कॉल करने योग्य हो सकता है, तो यह मामला नहीं है, क्योंकि एक सरणी के रूप में यह सच है जो पास होने पर 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';
नोट : इस उदाहरण में प्रतिध्वनि कई मापदंडों को लेती है ( अल्पविराम को देखें) ) को , इसलिए यह वास्तविक संघटन नहीं है
इको एक फ़ंक्शन के रूप में व्यवहार करता है, यह अधिक पैरामीटर लेता है, यह कॉन्फैनेटेशन की तुलना में अधिक कुशल होता है, क्योंकि इसे कॉनकैटेट नहीं करना पड़ता है और फिर इको होता है, यह बस नई स्ट्रिंग अवेटेड ऑब्जेक्ट बनाने की आवश्यकता के बिना सब कुछ गूँजता है :)
संपादित करें
इसके अलावा, यदि आप समझते हैं श्रृंखलाबद्ध रूप में तार, 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;
जैसा कि दूसरों ने बताया है कि आप ऐसा नहीं कर सकते। PHP में एक फ़ंक्शन 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.";
यहां, यह आपकी उंगलियों पर स्थिर रहने के लिए स्थिरांक को कम करता है, लेकिन आप उन्हें रखने के लिए array_change_key_case () को हटा सकते हैं। यदि आपके पास पहले से ही स्थानीय चर नामों में परस्पर विरोधी हैं, तो स्थिरांक उन्हें ओवरराइड नहीं करेगा।
स्ट्रिंग प्रतिस्थापन का उपयोग करना
यह स्प्रिंटफ () के समान है, लेकिन एकल प्रतिस्थापन टोकन का उपयोग करता है और असीमित संख्या में तर्क स्वीकार करता है। मुझे यकीन है कि ऐसा करने के बेहतर तरीके हैं, लेकिन मेरी अकड़ को माफ कर दें और इसके पीछे के विचार पर ध्यान देने की कोशिश करें।
पहले की तरह, आप एक पुन: प्रयोज्य कार्य बनाएँ:
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 का उपयोग कर सकते हैं:
$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';