.NET / जावा के toString () के बराबर PHP


556

मैं PHP चर के मान को स्ट्रिंग में कैसे परिवर्तित करूं?

मैं एक खाली स्ट्रिंग के साथ समतल करने से बेहतर कुछ तलाश रहा था:

$myText = $myVar . '';

ToString()जावा या .NET में विधि की तरह ।


6
यह सही उत्तर प्रतीत होता है: stackoverflow.com/a/3559247/11236 ( print_r(foo, true))!
ripper234

मैं उपयोग करूंगा json_encode($myText)। मैंने पाया है कि सुझाए गए समाधान print_rऔर (string)varस्केलर मूल्यों और सरल वस्तुओं के लिए अच्छी तरह से काम करते हैं। जटिल चरों, वर्गों या वस्तुओं के लिए यदि कोई पूर्ण __toString()परिभाषित नहीं है, तो मैं उपर्युक्त पसंद करता हूँ json_encode
एरिक किगाथी

जवाबों:


791

आप कास्टिंग ऑपरेटरों का उपयोग कर सकते हैं :

$myText = (string)$myVar;

PHP मैनुअल के स्ट्रिंग्स खंड में स्ट्रिंग कास्टिंग और रूपांतरण के लिए अधिक विवरण हैं , जिसमें बूलियन और नल के लिए विशेष हैंडलिंग शामिल है।


11
Object of class Foo could not be converted to string। क्या कोई सामान्य समाधान है जो कुछ भी (सरणियों + वस्तुओं + जो भी) को एक स्ट्रिंग में बदल सकता है?
ripper234


2
नोट: यह एक PHP नोटिस देगा जब सरणियों पर उपयोग किया जाता है।
dave1010

29
@MarkAmery उन्होंने एक जवाब दिया जो स्पष्ट रूप से __toString()"मैजिक मेथड" कहता है , लेकिन इसका उल्लेख बिल्कुल नहीं किया। उपयोगकर्ता ने एक उत्तर के लिए कहा जो जावा toString()विधि की तरह था , और PHP में, यह __toString()फ़ंक्शन है।
सुपरस्टार

2
@Supuhstar आह ठीक है, मैं अंत में समझता हूं कि आप कहां से आ रहे हैं। क्षमा करें, अगर मुझे पहले से परेशान किया जा रहा था। मैं मानता हूं कि यह एक प्रासंगिक विवरण है और इसे जोड़ने के लिए मूल्यवान होगा, शायद उत्तर को ver कन्वर्जिंग प्रिमिटिव्स ’और हेडर के साथ ऑब्जेक्ट्स को परिवर्तित करने वाले खंडों में अलग कर दें।
मार्क एमी

309

यह टाइपकास्टिंग के साथ किया जाता है:

$strvar = (string) $var; // Casts to string
echo $var; // Will cast to string implicitly
var_dump($var); // Will show the true type of the variable

एक वर्ग में आप जादुई विधि का उपयोग करके आउटपुट को परिभाषित कर सकते हैं __toString। एक उदाहरण नीचे है:

class Bottles {
    public function __toString()
    {
        return 'Ninety nine green bottles';
    }
}

$ex = new Bottles;
var_dump($ex, (string) $ex);
// Returns: instance of Bottles and "Ninety nine green bottles"

कुछ और प्रकार के कास्टिंग उदाहरण:

$i = 1;

// int 1
var_dump((int) $i);

// bool true
var_dump((bool) $i);

// string "1"
var_dump((string) 1);

126

प्रिंट_आर का उपयोग करें :

$myText = print_r($myVar,true);

आप इसका उपयोग भी कर सकते हैं जैसे:

$myText = print_r($myVar,true)."foo bar";

यह $myTextएक स्ट्रिंग पर सेट होगा , जैसे:

array (
  0 => '11',
)foo bar

थोड़ी और जानकारी पाने के लिए var_export का उपयोग करें (चर के प्रकार के साथ, ...):

$myText = var_export($myVar,true);

1
"जब रिटर्न पैरामीटर TRUE है, तो [print_r] एक स्ट्रिंग लौटाएगा।" जैसा कि Print_r वस्तुओं, सरणियों (और संख्या / तार) को प्रिंट करने का एक अच्छा तरीका है, यह एक वस्तु को मानव-पठनीय स्ट्रिंग में बदलने का एक अच्छा तरीका है।
सेड्रिक

1
FYI करें नवागंतुक, trueहिस्सा जरूरी है! मैंने स्ट्रिंग रूपांतरण के कई तरीकों की कोशिश की, जिनमें print_rसे सभी से निराश थे, और फिर मैंने trueपैरामीटर की खोज की (यह क्यों काम करता है इसके लिए प्रलेखन पढ़ें)।
ripper234

57

आप या तो टाइपकास्टिंग का उपयोग कर सकते हैं:

$var = (string)$varname;

या स्ट्रिंगवैल्यू:

$var = strval($varname);

या सेट टाइप:

$success = settype($varname, 'string');
// $varname itself becomes a string

वे सभी टाइप-जुग्लिंग के संदर्भ में एक ही चीज के लिए काम करते हैं।


strval ($ varname) मेरे लिए ट्रिक करता है, खासकर जब वैल्यू को "वेरिएंट" के रूप में लौटाया जाता है और इसे स्ट्रिंग या इंट में बदलने की आवश्यकता होती है।
मिलान

strval()मैं इसके लिए उपयोग करना चाहता था क्योंकि मैं इसके साथ दिख रहा था array_walk। जैसे$array = array('cat',$object); array_walk($array,'strval'); // $array = array('cat',$object->__toString)
बटलुक

33

मैं PHP चर के मान को स्ट्रिंग में कैसे परिवर्तित करूं?

मान स्ट्रिंग () स्ट्रिंग या स्ट्रिंग () फ़ंक्शन का उपयोग करके स्ट्रिंग में परिवर्तित किया जा सकता है । (संपादित करें: जैसा कि थॉमस ने भी कहा है)।

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


28

आप तार की तलाश कर रहे हैं :

string strval ( mixed $var )

एक चर का स्ट्रिंग मान प्राप्त करें। स्ट्रिंग में कनवर्ट करने के बारे में अधिक जानकारी के लिए स्ट्रिंग पर प्रलेखन देखें।

यह फ़ंक्शन लौटाए गए मान पर कोई स्वरूपण नहीं करता है। यदि आप एक स्ट्रिंग के रूप में संख्यात्मक मान को प्रारूपित करने का तरीका ढूंढ रहे हैं, तो कृपया स्प्रिंटफ () या नंबर_फॉर्मेट () देखें।


3
यह वास्तव में बहुत उपयोगी है क्योंकि मैं कस्टम कॉलबैक का उपयोग किए बिना सभी नंबरों को स्ट्रिंग में बदलना चाहता था। $strings = array_map('strval', $my_numbers);
पीटरचूला

यह एकमात्र उत्तर है जो array_mapसामान्य रूप से और स्ट्रिंग कॉलबल्स के साथ काम करता है ।
दानोन

18

प्रिमिटिव के लिए बस (string)$varइस वेरिएबल को सीधे उपयोग या प्रिंट करें PHP गतिशील रूप से टाइप की गई भाषा है और चर को उड़ने के लिए स्ट्रिंग में डाला जाएगा।

यदि आप वस्तुओं को स्ट्रिंग में बदलना चाहते हैं, तो आपको __toString()स्ट्रिंग को लौटाने वाली विधि को परिभाषित करने की आवश्यकता होगी । अपवादों को फेंकने के लिए यह विधि निषिद्ध है।


15

इसे दोहरे उद्धरण चिह्नों में रखकर काम करना चाहिए:

$myText = "$myVar";

यह काम करता है, लेकिन मुझे नहीं पता कि यह PHP में करने का मानक तरीका है या नहीं।
एंटोनी ऑब्री

यह बैश
Yauhen Yakimovich

यह तरीका काम करेगा अगर $ myVar __toString या स्केलर प्रकार के साथ वर्ग का एक ऑब्जेक्ट है। अन्य मामलों में एक त्रुटि उत्पन्न करते हैं।
ज़ेनिन

11

मुझे लगता है कि यह उल्लेख है कि आप किसी भी निर्गम (तरह पकड़ कर सकते हैं लायक है print_r, var_dumpउत्पादन बफरिंग का उपयोग करके) एक चर में:

<?php
    ob_start();
    var_dump($someVar);
    $result = ob_get_clean();
?>

इसके लिए धन्यवाद: मैं स्ट्रिंग के लिए var_dump का परिणाम कैसे पकड़ सकता हूं?


1
यह ध्यान देने योग्य है कि आपको print_r के साथ की आवश्यकता नहीं है । बस एक स्ट्रिंग के रूप में लौटने के लिए ओवरराइड का उपयोग करें।
ars265

1
एक बेहतर तरीका $result = var_export($someVar, true)बिना किसी आज्ञा के उपयोग करना होगा ।
दानोन

8

एक अन्य विकल्प सेटलमेंट फ़ंक्शन में निर्मित का उपयोग करना है:

<?php
$foo = "5bar"; // string
$bar = true;   // boolean

settype($foo, "integer"); // $foo is now 5   (integer)
settype($bar, "string");  // $bar is now "1" (string)
?>

यह वास्तव में टाइपकास्टिंग के विपरीत चर पर रूपांतरण करता है और आपको कई प्रकारों में परिवर्तित होने का एक सामान्य तरीका है।


8

थॉमस जी। मेफील्ड द्वारा दिए गए उत्तर के अलावा:

यदि आप स्ट्रिंग कास्टिंग मैनुअल के लिंक का अनुसरण करते हैं, तो एक विशेष मामला है जो समझना बहुत महत्वपूर्ण है:

(स्ट्रिंग) कास्ट विशेष रूप से बेहतर है यदि आपका चर $ ए एक वस्तु है, क्योंकि PHP अपने ऑब्जेक्ट मॉडल के अनुसार कास्टिंग प्रोटोकॉल का पालन करेगा __toString () जादू विधि (यदि ऐसा उस वर्ग में परिभाषित किया गया है, जिसमें से $ a का तत्काल मूल्यांकन किया गया है )।

PHP कुछ ऐसा ही करती है

function castToString($instance) 
{ 
    if (is_object($instance) && method_exists($instance, '__toString')) {
        return call_user_func_array(array($instance, '__toString'));
    }
}

(स्ट्रिंग) कास्टिंग आपरेशन PHP5 + कोड अधिक वस्तु उन्मुख बनाने प्रोग्रामिंग के लिए एक सिफारिश की तकनीक है। IMO यह अन्य OOP भाषाओं जैसे कि Java / C # / etc की तरह डिजाइन समानता (अंतर) का एक अच्छा उदाहरण है, अर्थात अपने विशेष PHP तरीके से (जब भी यह अच्छे या मूल्य के लिए हो)।


8

जैसा कि दूसरों ने उल्लेख किया है, वस्तुओं __toStringको एक स्ट्रिंग में डालने के लिए एक विधि की आवश्यकता होती है । एक ऑब्जेक्ट जो उस पद्धति को परिभाषित नहीं करता है वह अभी भी spl_object_hash फ़ंक्शन का उपयोग करके एक स्ट्रिंग प्रतिनिधित्व का उत्पादन कर सकता है ।

यह फ़ंक्शन ऑब्जेक्ट के लिए एक विशिष्ट पहचानकर्ता देता है। इस आईडी का उपयोग वस्तुओं को संग्रहीत करने के लिए, या किसी वस्तु की पहचान के लिए हैश की के रूप में किया जा सकता है, जब तक कि वस्तु नष्ट न हो। एक बार जब वस्तु नष्ट हो जाती है, तो अन्य वस्तुओं के लिए इसका हैश पुन: उपयोग किया जा सकता है।

मेरे पास बेस ऑब्जेक्ट क्लास है जिसमें एक __toStringविधि है जो md5(spl_object_hash($this))आउटपुट को स्पष्ट रूप से विशिष्ट बनाने के लिए कॉल करने के लिए डिफॉल्ट करती है , क्योंकि spl_object_hash से आउटपुट वस्तुओं के बीच बहुत समान दिख सकता है।

यह कोड डिबगिंग के लिए विशेष रूप से सहायक होता है जहां एक चर वस्तु के रूप में आरंभ होता है और बाद में कोड में यह एक अलग वस्तु में परिवर्तित होने का संदेह होता है। बस चर को लॉग में गूँजने से वस्तु हैश (या नहीं) से परिवर्तन प्रकट हो सकता है।


6

कुछ नहीं, यदि सभी नहीं, तो पिछले उत्तरों में दिए गए तरीके विफल हो जाते हैं जब इच्छित स्ट्रिंग चर में अग्रणी शून्य होता है , उदाहरण के लिए, 077543

इस तरह के एक चर को परिवर्तित करने का प्रयास इरादा स्ट्रिंग प्राप्त करने में विफल रहता है, क्योंकि चर को आधार 8 (अष्टक) में बदल दिया जाता है ।

इन सभी का $strमूल्य 32611 होगा :

$no = 077543
$str = (string)$no;
$str = "$no";
$str = print_r($no,true);
$str = strval($no);
$str = settype($no, "integer");

1
यह PICNIC है (कुर्सी में समस्या, कंप्यूटर में नहीं ) क्योंकि यहाँ कुछ भी विफल नहीं है ! print 077543;आउटपुट 32611, इसलिए यह सही स्ट्रिंग मान है $no। कोई भी उम्मीद नहीं करता है कि (string)+1स्ट्रिंग लौटाता है +1(यह सही ढंग से रिटर्न करता है 1) और न ही $no = 1+1; print (string)$no;आउटपुट 1+1। नोट्स: (1) हेक्स ( $no=0xff;) के लिए भी। (2) आप ऑक्टल वैल्यू को वापस पा सकते हैं '0'.decoct($no);(3) $no="077543";अग्रणी रखता है 0, "077543" + 1` देता है 77544जबकि 077543+1(सही ढंग से) देता है 32612। (पुनश्च: डाउनवोट नहीं किया गया है, क्योंकि यह इरिटेट आम है)
टीनो

4

मुझे लगता है कि यह सवाल थोड़ा भ्रामक है, क्योंकि जावा में स्ट्रैसिंग () केवल एक स्ट्रिंग को कुछ करने का एक तरीका नहीं है। यही (स्ट्रिंग) या String.valueOf () के माध्यम से कास्टिंग होता है, और यह PHP में भी काम करता है।

// Java
String myText = (string) myVar;

// PHP
$myText = (string) $myVar;

ध्यान दें कि यह समस्याग्रस्त हो सकता है क्योंकि जावा टाइप-सुरक्षित है ( अधिक विवरण के लिए यहां देखें )।

लेकिन जैसा कि मैंने कहा, यह कास्टिंग है और इसलिए जावा के इनस्ट्रिंग () के बराबर नहीं है।

जावा में स्ट्रिंग केवल एक स्ट्रिंग के लिए एक वस्तु नहीं डालती है। इसके बजाय यह आपको स्ट्रिंग प्रतिनिधित्व देगा । और यही PHP में __toString () करता है।

// Java
class SomeClass{
    public String toString(){
        return "some string representation";
    }
}

// PHP
class SomeClass{
    public function __toString()
    {
        return "some string representation";
    }
}

और दूसरी तरफ से:

// Java
new SomeClass().toString(); // "Some string representation"

// PHP
strval(new SomeClass); // "Some string representation"

"स्ट्रिंग प्रतिनिधित्व देने" से मेरा क्या मतलब है? लाखों पुस्तकों के साथ एक पुस्तकालय के लिए एक वर्ग की कल्पना करो।

  • उस कक्षा को एक स्ट्रिंग पर ले जाना (डिफ़ॉल्ट रूप से) डेटा को परिवर्तित कर देगा, यहाँ सभी पुस्तकें, एक स्ट्रिंग में, ताकि स्ट्रिंग बहुत लंबी हो जाए और अधिकांश समय या तो बहुत उपयोगी न हो।
  • इसके बजाय स्ट्रिंग करने के लिए आप स्ट्रिंग प्रतिनिधित्व दे देंगे, यानी, केवल पुस्तकालय का नाम। यह छोटा है और इसलिए आपको कम, लेकिन अधिक महत्वपूर्ण जानकारी देता है।

ये दोनों मान्य दृष्टिकोण हैं लेकिन बहुत अलग लक्ष्यों के साथ, न तो हर मामले के लिए एक सही समाधान है और आपको समझदारी से चुना जाना चाहिए जो आपकी आवश्यकताओं के लिए बेहतर है।

ज़रूर, और भी विकल्प हैं:

$no = 421337  // A number in PHP
$str = "$no"; // In PHP, stuff inside "" is calculated and variables are replaced
$str = print_r($no, true); // Same as String.format();
$str = settype($no, 'string'); // Sets $no to the String Type
$str = strval($no); // Get the string value of $no
$str = $no . ''; // As you said concatenate an empty string works too

ये सभी विधियाँ एक स्ट्रिंग लौटाएंगी, उनमें से कुछ का उपयोग __toString आंतरिक रूप से और कुछ अन्य वस्तुओं पर विफल होंगे। अधिक जानकारी के लिए PHP प्रलेखन पर एक नज़र डालें ।


3

प्रलेखन कहता है कि आप भी कर सकते हैं:

$str = "$foo";

यह कास्ट के समान ही है, लेकिन मुझे लगता है कि यह प्रीटियर दिखता है।

स्रोत:


1

दोहरे उद्धरण चिह्नों पर भी काम करना चाहिए ... इसे एक स्ट्रिंग बनाना चाहिए, फिर इसे 2 खाली तारों के बीच $ myVar के अंकित STRING मान को APPEND / INSERT करना चाहिए।



1

यदि आप पूर्णांक या बूलियन्स जैसे सरल प्रकारों के अलावा कुछ भी परिवर्तित कर रहे हैं, तो आपको उस प्रकार के लिए अपना फ़ंक्शन / विधि लिखना होगा, जिसे आप कनवर्ट करने का प्रयास कर रहे हैं, अन्यथा PHP केवल प्रकार (जैसे सरणी, GoogleSniffer) , या बिडेट)।


1

PHP गतिशील रूप से टाइप किया जाता है, इसलिए जैसे क्रिस फोरनियर ने कहा, "यदि आप इसे स्ट्रिंग की तरह उपयोग करते हैं तो यह एक स्ट्रिंग बन जाता है"। यदि आप स्ट्रिंग के प्रारूप पर अधिक नियंत्रण की तलाश कर रहे हैं तो प्रिंटफ आपका जवाब है।



1
$parent_category_name = "new clothes & shoes";

// To make it to string option one
$parent_category = strval($parent_category_name);

// Or make it a string by concatenating it with 'new clothes & shoes'
// It is useful for database queries
$parent_category = "'" . strval($parent_category_name) . "'";

नीच, जैसा कि मुझे वास्तव में पता नहीं है कि आप हमें क्या बताना चाहते हैं। strval()तार का उपयोग करना समय की पूरी बर्बादी है।
टीनो

दोस्त बात यह है कि आप एक स्ट्रिंग मान प्राप्त किया है = जब इसके पीछे यह "स्ट्रिंग" होने जा रहा है। लेकिन, जब आप यह प्रदर्शित करना चाहते थे कि जावास्क्रिप्ट में आपको इसे 'स्ट्रिंग' बनाने की आवश्यकता है
डैनियल एडेन्यू

यह बेहद खतरनाक है (कहने के लिए नहीं: सादा गलत)। कृपया यह जानने के लिए stackoverflow.com/q/168214 या stackoverflow.com/q/23740548 पर एक नज़र डालें कि कैसे PHP से JS तक सुरक्षित रूप से पास किया जाए! (थोड़ा सा अपमानित होने के लिए क्षमा करें: JS में PHP संस्करण पास करना सवाल का हिस्सा नहीं था।)
Tino

0

ऑब्जेक्ट के लिए, आप कास्ट ऑपरेटर का उपयोग करने में सक्षम नहीं हो सकते हैं। इसके बजाय, मैं json_encode()विधि का उपयोग करता हूं ।

उदाहरण के लिए, निम्न त्रुटि लॉग में सामग्री आउटपुट करेगा:

error_log(json_encode($args));

0

यह थोड़ा अजीब है, लेकिन कोशिश कर रहा हूँ, stdClass के पाठ भाग को स्ट्रिंग प्रकार में बदलने के लिए दृष्टिकोण:

$my_std_obj_result = $SomeResponse->return->data; // Specific to object/implementation

$my_string_result = implode ((array)$my_std_obj_result); // Do conversion

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.