2008-10-10 10 views
9

आमतौर पर पायथन और रूबी की तरह OO भाषाओं में इस्तेमाल एक मुहावरा एक वस्तु instantiating और जैसे तरीकों कि वस्तु ही के लिए एक संदर्भ लौटने के लिए, चेन है:"इनलाइन" क्लास इंस्टेंटेशन? (विधि श्रृंखलन की आसानी के लिए)

s = User.new.login.get_db_data.get_session_data 

PHP में यह,

$u = new User(); 
$s = $u->login()->get_db_data()->get_session_data(); 

syntax error, unexpected T_OBJECT_OPERATOR में निम्न परिणाम प्रयास कर रहा है: इसलिए की तरह इस व्यवहार को दोहराने के लिए संभव है

$s = new User()->login()->get_db_data()->get_session_data(); 

ऐसा लगता है कि यह स्थैतिक तरीकों का उपयोग करके पूरा किया जा सकता है, जो शायद मैं कर रहा हूं, लेकिन मैं lazyweb की जांच करना चाहता था: क्या वास्तव में PHP वर्ग "इनलाइन" को तुरंत चालू करने के लिए एक साफ, सरल तरीका है (जैसा दिखाया गया है उपरोक्त स्निपेट में) इस उद्देश्य के लिए?

मैं स्थिर विधियों का उपयोग करने का फैसला करते हैं, यह भी एक वर्ग के स्थिर विधि वर्ग ही के इन्स्टेन्शियशन लौटने के लिए sorcerous है? (प्रभावी रूप से अपने स्वयं के कन्स्ट्रक्टर को लिखना-वह-एक-कन्स्ट्रक्टर नहीं है?) यह गंदा लगता है, लेकिन अगर बहुत डरावने साइड इफेक्ट्स नहीं हैं, तो मैं बस ऐसा कर सकता हूं।

मुझे लगता है कि मैं get_user() विधि के साथ उपयोगकर्ता फ़ैक्टरी को पूर्व-तत्काल भी कर सकता हूं, लेकिन मैं ऊपर जो पूछा है उसके समाधान के बारे में उत्सुक हूं।

+4

चूंकि PHP 5.4 निम्न कार्य करता है: '(नया उपयोगकर्ता()) -> लॉगिन() -> ... ', देखें [PHP चेंजलॉग] (http://php.net/ChangeLog-5.php) 5.4 के लिए .0 * "तत्कालता पर कक्षा सदस्य का उपयोग जोड़ा गया (उदाहरण के लिए (नया foo) -> बार()) समर्थन "* – hakre

उत्तर

12

इन प्रस्तावित समाधान के सभी क्रम में अपने कोड को मुश्किल कुछ वाक्य रचनात्मक nicety को पूरा करने के लिए PHP मोड़ने के लिए। PHP को ऐसा कुछ होना चाहते हैं जो (अच्छा नहीं) पागलपन का मार्ग है।

मैं सिर्फ का प्रयोग करेंगे:

$u = new User(); 
$s = $u->login()->get_db_data()->get_session_data(); 

यह स्पष्ट है, अपेक्षाकृत संक्षिप्त है और कोई काला जादू कि त्रुटियों लागू कर सकते हैं शामिल है।

और निश्चित रूप से, आप हमेशा रूबी या पायथन में जा सकते हैं। यह आपके जीवन को बदल देगा।

  • और हाँ, मैं PHP पर कठोर हूं। मेरे द्वारा इसे हर दिन उपयोग किया जाता है। वर्षों से इसका इस्तेमाल कर रहे थे। हकीकत यह है कि ने को डिजाइन किए जाने के बजाय, यह दिखाया है और यह दिखाता है।
+0

मैं रुबी पसंद करता हूं, फिर पाइथन, फिर PHP, लेकिन मैं नियमित रूप से सभी तीनों में प्रोग्राम करता हूं। –

+1

हाँ ... PHP के साथ मैंने सीखा सबसे बड़ा सबक यह है कि आपको अनाज के साथ काटना है। PHP के साथ काम करें और यह बहुत ही बढ़िया है, लेकिन इसे अलग करना चाहते हैं और आप अपना खुद का छेद खोदने जा रहे हैं। –

+0

कम से कम अब मुझे पुष्टि है कि आप यह नहीं कर सकते हैं। क्या आप मुझे PHP भाषा संदर्भ में कह सकते हैं कि कहता है कि आप ऐसा क्यों नहीं कर सकते? अरे। –

8
<?php 

    class User 
    { 
     function __construct() 
     { 
     } 

     function Login() 
     { 
      return $this; 
     } 

     function GetDbData() 
     { 
      return $this; 
     } 

     function GetSession() 
     { 
      return array("hello" => "world"); 
     } 
    } 

    function Create($name) 
    { 
     return new $name(); 
    } 

    $s = Create("User")->Login()->GetDbData()->GetSession(); 

    var_dump($s); 
?> 

यह एक संभव समाधान :) बेशक है, तो आप

समारोह के लिए एक बेहतर नाम का चयन करना चाहिए ... या आप एक छोटे से भूमि के ऊपर कोई आपत्ति नहीं है, तो:

<?php 

    class User 
    { 
     function __construct($test) 
     { 
      echo $test; 
     } 
... 
    } 

    function CreateArgs($name) 
    { 
     $ref = new ReflectionClass($name); 
     return $ref->newInstanceArgs(array_slice(func_get_args(), 1)); 
    } 

    $s = CreateArgs("User", "hi")->Login()->GetDbData()->GetSession(); 

    var_dump($s); 
?> 
+0

धन्यवाद! मैंने दूसरे साथी के जवाब को स्वीकार कर लिया, लेकिन अगर मैं दो स्वीकार कर सकता हूं, तो मैं भी आपका स्वीकार करूंगा। PHP को झुकाव करने के बारे में चिंतन करने का बिंदु यह कुछ नहीं था केवल विशेष रूप से मेरे लिए महत्वपूर्ण महसूस करने के लिए डिज़ाइन किया गया है। –

5

एकमात्र तरीका आप कुछ समान प्राप्त कर सकते हैं कारखाने या सिंगलटन स्थैतिक विधि के साथ। उदाहरण के लिए:

class User 
{ 
    //... 
    /** 
    * 
    * @return User 
    */ 
    public static function instance() 
    { 
     $args = func_get_args(); 
     $class = new ReflectionClass(__CLASS__); 
     return $class->newInstanceArgs($args); 
    } 
    //... 
} 

एक नया उदाहरण (उदाहरण() :: भेजी गई किसी आर्ग का प्रयोग करके) बनाने के लिए PHP5 प्रतिबिंब API का उपयोग करता है और यह आप श्रृंखलन करने की अनुमति देता है कि:

$s = User::instance()->login()->get_db_data()->get_session_data(); 

जिस तरह से कोड पर्याप्त लचीला है कि उस स्थिर विधि की प्रतिलिपि करते समय आपको केवल एक ही चीज़ बदलनी होगी, PHPDoc टिप्पणी @return है।


आप समय से पहले ही हमारे दोस्त नेल्सन की तरह अपने कोड को अनुकूलित करना चाहते हैं तो आप के साथ) उपयोगकर्ता :: उदाहरण की सामग्रियों (जगह ले सकता है:

return new self(); 
+1

प्रतिबिंब का उपयोग करना स्थैतिक-विधि दृष्टिकोण करते समय ओवरहेड के लायक नहीं है। आपको ओवरहेड नहीं जोड़ना चाहिए जहां ओवरहेड की आवश्यकता नहीं है;) – nlaq

+0

या हम तर्कों को भेजने के लिए मानकों का पालन कर सकते हैं जब आप __construct() – dcousineau

+0

को बदलते हैं तो आपको इंस्टेंस() विधि को लगातार अद्यतन करने की आवश्यकता नहीं होती है, यह जानने के लिए केवल मूर्खतापूर्ण है कि एक ही चीज़ को तेज़ी से किया जा सकता है। "समय-समय पर अनुकूलन" सामान्य ज्ञान का उपयोग करके अलग है। "और मेरे समाधान को प्रतिलिपि + चिपकने वाले कोड की आवश्यकता नहीं है। हालांकि - मैं शर्त लगाता हूं कि हम दोनों सहमत हैं कि कारखाने के पैटर्न का उपयोग किसी भी तरह से किया जाना चाहिए :) – nlaq

5

एक हैक (वाक्यविन्यास मुद्दे के आसपास काम करने के लिए) और ऑब्जेक्ट निर्माण कोड स्वयं को चिपकाने का कोई कारण नहीं है।

के बाद से एक नई अभिव्यक्ति अपने वस्तु ऑपरेटर के बाईं सदस्य के रूप में नहीं किया जा सकता है, लेकिन एक समारोह कॉल अभिव्यक्ति, आप केवल एक समारोह है कि अपनी ही तर्क देता है के लिए एक कॉल में अपनी वस्तु रैप करने के लिए की जरूरत है सकते हैं:

function hack($obj) { return $obj; } 

$mail = hack(new Zend_Mail()) 
    -> setBodyText('This is the text of the mail.') 
    -> setFrom('[email protected]le.com', 'Some Sender') 
    -> addTo('[email protected]', 'Some Recipient') 
    -> setSubject('TestSubject'); 
+0

यह विधि बहुत अच्छी तरह से काम करता है ... – Nick

3

एक साधारण शॉर्टकट

को
$Obj = new ClassName(); 
$result = $Obj->memberFunction(); 

$result = (new ClassName())->memberFunction(); 
1
<?php 
//PHP 5.4+ class member access on instantiation support. 
$s = (new User())->login()->get_db_data()->get_session_data(); 
है
संबंधित मुद्दे