समवर्ती के बिना स्ट्रिंग में निरंतर शामिल करें


166

क्या पीएचपी में एक तरीका है एक कॉन्टैस्ट को बिना स्ट्रिंग में शामिल करने के लिए?

define('MY_CONSTANT', 42);

echo "This is my constant: MY_CONSTANT";

12
अंतर्ज्ञान मुझे बताता है कि "यह मेरा निरंतर है: {MY_CONSTANT}" काम करना चाहिए। यह नहीं है इस मामले में यहाँ किसी को लगा कि मैं जैसा ही सोचता हूँ
मिकेल लिंडक्विस्ट

जवाबों:


148

नहीं।

स्ट्रिंग्स के साथ, PHP के लिए निरंतर पहचानकर्ताओं के अलावा स्ट्रिंग डेटा को बताने का कोई तरीका नहीं है। यह PHP में किसी भी स्ट्रिंग प्रारूप के लिए जाता है, जिसमें heredoc भी शामिल है।

constant() एक स्थिर पकड़ पाने का एक वैकल्पिक तरीका है, लेकिन एक फ़ंक्शन कॉल को या तो संघनन के बिना एक स्ट्रिंग में नहीं रखा जा सकता है।

PHP में स्थिरांक पर मैनुअल


1
वैसे भी यह निस्संदेह सही उत्तर है। पहले मैं आपके जैसा ही लिखना चाहता था, लेकिन आपका पढ़ने के बाद, मुझे लगा कि मुझे कुछ अलग पेश करना होगा;)
फेलिक्स क्लिंग

3
हेहे! लेकिन रचनात्मकता के लिए सभी के लिए एक अच्छी तरह से योग्य +1। :)
पेका

59
: "समारोह कॉल एक स्ट्रिंग में डाल नहीं किया जा सकता" हाँ यह कर सकते हैंdefine('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
raveren

1
@ रेवरेन, जबकि अन्य लोग अप्रत्यक्ष रूप से भिन्नताएं प्रदान करते हैं, अनावश्यक रूप से फ़ंक्शन का निर्माण करते हैं, आपका सबसे छोटा और बिंदु समाधान है जो कि चर कार्यों पर निर्भर करता है, पीएचपी की कम और बहुत ही कम उपयोग की जाने वाली सुविधा है। इस पूरे धागे में से मैं आपके विशेष समाधान के साथ गया था। काश मैं इसे एक से अधिक बार +1 कर पाता।
23 अक्टूबर को hndcrftd

4
मैंने अभी बताया कि यह संभव है, इस पर टिप्पणी नहीं की कि कौन सा तरीका बेहतर है।
बजे

111

हाँ यह (किसी तरह से);):

define('FOO', 'bar');

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

यह संभवतः वह नहीं है जो आप के लिए लक्ष्य कर रहे थे, लेकिन मुझे लगता है, तकनीकी रूप से यह कोई संगति नहीं है, लेकिन एक प्रतिस्थापन है और इस धारणा से, इसमें एक संघटन के बिना स्ट्रिंग में एक स्थिरांक शामिल है


5
@Pekka: मुझे पता है :-D (बस इस बार ...?)
फेलिक्स क्लिंग

1
:) @ juraj.blahunka का दृष्टिकोण और भी अधिक डरपोक है। यह पत्र द्वारा प्रश्न का उत्तर देता है, लेकिन इसकी भावना नहीं। :)
पकाका

2
@blahunka: अच्छा आदर्श वाक्य। हम शायद इसे दैनिक उपयोग करते हैं
अल्फ़ाब्रावो

57

तार के अंदर स्थिरांक का उपयोग करने के लिए आप निम्न विधि का उपयोग कर सकते हैं:

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

याद रखो

यह अभ्यास बीमार है, लेकिन कभी-कभी यह अधिक पठनीय कोड होता है, इसलिए यह आपके ऊपर है - संभावना है।


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

नोट : इस उदाहरण में प्रतिध्वनि कई मापदंडों को लेती है ( अल्पविराम को देखें) ) को , इसलिए यह वास्तविक संघटन नहीं है

इको एक फ़ंक्शन के रूप में व्यवहार करता है, यह अधिक पैरामीटर लेता है, यह कॉन्फैनेटेशन की तुलना में अधिक कुशल होता है, क्योंकि इसे कॉनकैटेट नहीं करना पड़ता है और फिर इको होता है, यह बस नई स्ट्रिंग अवेटेड ऑब्जेक्ट बनाने की आवश्यकता के बिना सब कुछ गूँजता है :)

संपादित करें

इसके अलावा, यदि आप समझते हैं श्रृंखलाबद्ध रूप में तार, 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

जैसा कि दूसरों ने बताया है कि आप ऐसा नहीं कर सकते। PHP में एक फ़ंक्शन constant()होता है जिसे सीधे एक स्ट्रिंग में नहीं बुलाया जा सकता है लेकिन हम आसानी से इस के आसपास काम कर सकते हैं।

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

और इसके उपयोग पर एक मूल उदाहरण:

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

आप $constant = 'constant';किसी अन्य फ़ंक्शन को परिभाषित करने के बजाय बस कर सकते हैं , और यह पहचान के साथ काम करेगा क्योंकि यह फ़ंक्शन पहले से मौजूद है।
रेडरिनार्ड

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.";

यहां, यह आपकी उंगलियों पर स्थिर रहने के लिए स्थिरांक को कम करता है, लेकिन आप उन्हें रखने के लिए 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 );

आप किसी भी प्रतिस्थापन टोकन का उपयोग कर सकते हैं, जैसे% या #। मैंने यहाँ स्लैश का उपयोग किया है क्योंकि यह टाइप करना थोड़ा आसान है।


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 का उपयोग कर सकते हैं:

$GLOBALS['const'] = function($a){return $a;};

भविष्य के उपयोग के लिए यह सुरक्षित नहीं है। और क्या बुरा है - यह अभी भी बदसूरत लग रहा है।


-2

मेरा मानना ​​है कि यह ओपी के मूल प्रश्न का उत्तर देता है। एकमात्र बात यह है कि ग्लोबल्स इंडेक्स कुंजी केवल निचले मामले के रूप में काम करती है।

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

आउटपुट:

DB_USER=root

1
यह काम नहीं करता है (भले ही आप अपरकेस का लगातार उपयोग करते हों) $ GLOBALS है an associative array containing references to all variables
har-wradim

यह उत्तर गलत है। एक ही तरीका है कि यह संभवतः उस उत्पादन का उत्पादन कर सकता है यदि आपकी स्क्रिप्ट में कहीं आपके पास भी है$db_user = 'root';
जेफ पकेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.