2011-09-01 9 views
7

मैं php में कुछ पुन: प्रयोज्य वस्तुएं बना रहा हूं, और मैं जानना चाहता था कि उन्हें बनाने का सबसे अच्छा तरीका क्या है। नीचे मेरे पास ऐसा करने के विभिन्न तरीकों के 2 उदाहरण हैं।PHP में आप पुन: प्रयोज्य वस्तुओं को कैसे बनाते हैं ?, क्या इसका सबसे अच्छा अभ्यास है? आप क्या करना चाहते हैं?

Class Uploader{ 
    public $Filename; 
    public $Directory; 

    function upload(){ 
     upload_file($this->Filename, $this->Directory) 
    } 
} 

// Then use the class above like this. 
$u = new Uploader; 
$u->Filename = 'foo.png'; // Set all the props 
$u->Directory = 'bar/' //^^^^
$u->upload();    // Then Execute 

या यह बेहतर हो यह करने के लिए होगा ...

Class Uploader { 
    function uploader($filename, $directory){ 
     upload_file($filename, $directory) 
    } 
} 

// Then use the class above like this. 
$u = new Uploader; 
$u->uploader('foo.png', 'bar/') // Obviously much less code, All in One. 

इन दोनों तरीकों, जो एक पसंद किया जाता है में से , उनकी गति अंतर या एक का उपयोग कर के लाभ के किसी भी प्रकार है दूसरे पर?
मैं उदाहरण # 1 का पक्ष लेता हूं, लेकिन क्या यह उनके लिए सबसे अच्छा अभ्यास है?

+0

आप निश्चित रूप से परिभाषित करने के लिए एक अजीब तरीके से उपयोग एक कक्षा। ब्रैकेट्स के साथ गलत क्या है, जैसे कि हममें से बाकी का उपयोग करें :) – TJHeuvel

+0

यह शायद आपका उदाहरण है, लेकिन दोनों मेरे लिए गलत लगते हैं: कक्षा में किसी फ़ंक्शन में एक स्थिर फ़ंक्शन को लपेटना बहुत उपयोगी नहीं लगता है। यदि आप PHP 5.3+ पर हैं तो आप इस तरह की सामग्री के लिए नामस्थान का उपयोग कर सकते हैं। – jeroen

उत्तर

7

आप दोनों क्यों नहीं कर सकते?

class Uploader 
{ 
    public 
    $filename, 
    $directory; 

    public function __construct($name = '', $dir = '', $autoUpload = false) 
    { 
    $this->filename = $name; 
    $this->directory = $dir; 
    if ($autoUpload) 
    { 
     $this->upload() 
    } 
    } 

    public function upload() 
    { 
    //check your values 
    ...code... 
    upload_file($this->filename, $this->directory); 
    } 
} 
इस तकनीक के साथ

, आप स्वचालित रूप से बस के साथ एक फ़ाइल अपलोड कर सकते हैं:

$uploader = new Uploader($name, $dir, true); 

या आप मैन्युअल रूप से वस्तु का निर्माण कर सकते हैं:

$uploader = new Uploader(); 
$uploader->filename = $name; 
$uploader->directory = $dir; 
$uploader->upload(); 
+0

मैंने इसके बारे में नहीं सोचा, यह एक बहुत अच्छा विचार है। – Anil

+0

कन्स्ट्रक्टर में काम करना आमतौर पर एक अच्छा विचार नहीं है। – igorw

+1

@igorw, यह सबसे हास्यास्पद चीज़ है जो मैंने कभी पढ़ा है। कन्स्ट्रक्टर * वस्तु * निर्माण * के लिए है। ऐसे सभी प्रकार के काम हैं जो कन्स्ट्रक्टर में कर सकते हैं और * किया जाना चाहिए। – zzzzBov

6

विधि एक क्लासिक ओओ दृष्टिकोण है जहां आपके द्वारा बनाई गई वस्तु डेटा और उस डेटा पर कार्य करने के तरीके रखती है। विधि दो बस कक्षा के भीतर कार्यों की उपयोगिता पुस्तकालय बना रहा है। विधि दो निस्संदेह तेज़ है, लेकिन इसके दृष्टिकोण में कम ओओ है। यदि आप पुन: उपयोग के लिए शूटिंग कर रहे हैं, तो मैं वास्तव में विधि एक के साथ जाऊंगा। यदि यह प्रदर्शन आप चाहते हैं, तो कक्षाओं का उपयोग करके पूरी तरह से छोड़ें और एक कार्यात्मक पुस्तकालय लिखें।

4

डैनियल परेरा प्रदर्शन के बारे में सही है।

दो उदाहरण (कार्यक्षमता & पुन: उपयोग) मिश्रण करने के लिए, आप की कोशिश कर सकते हैं:

Class Uploader{ 
    public $Filename; 
    public $Directory; 

    function Uploader($this->Filename, $this->Directory){ 
     upload_file($this->Filename, $this->Directory); 
    } 
} 
$a = new Uploader('foo.png','bar'); 
echo $a->Filename; //foo.png 
echo $a->Directory; //bar 

यह (एक गलती की वजह से) वास्तव में होना चाहिए:

Class Uploader{ 
     public $Filename; 
     public $Directory; 

     function Uploader($Filename, $Directory){ 
      $this->Filename = $Filename; 
      $this->Directory = $Directory; 
      upload_file($this->Filename, $this->Directory); 
     } 
    } 
+0

जिज्ञासा से बाहर, क्या आप इस तरह सुरक्षित/निजी गुण भी सेट कर सकते हैं? – gilden

+0

हाँ आप कर सकते हैं! लेकिन याद रखें कि आप उन्हें आसान '$ a-> फ़ाइल नाम' के साथ कॉल करने में सक्षम नहीं होंगे ... – Franquis

+0

+1 आसान टिप के लिए। मेरे तरीकों में मूल्यों को असाइन करने के लिए मुझे अलग-अलग चर का उपयोग नहीं करना पड़ेगा! मुझे आश्चर्य है कि यह बहुत ज्ञात नहीं है या बुरा अभ्यास माना जाता है। – gilden

2

आप सच करना चाहते हैं तो ओओ, पहला उदाहरण बहुत अच्छा है। एक अन्य सुझाव यह होगा:

Class Uploader{ 
    private $Filename; 
    private $Directory; 

    function upload(){ 
     upload_file($this->Filename, $this->Directory) 
    } 

} 

तो फिर तुम तो तुम सार बाहर उन क्षेत्रों की स्थापना के लिए बाद में setFileName और setDirectory तरीकों बना सकते हैं।

आप इसमें उन क्षेत्रों के साथ एक कन्स्ट्रक्टर भी बना सकते हैं। इस समस्या को हल करने के कई तरीके।

संबंधित मुद्दे