2010-07-04 8 views
6

यहाँ एक परिदृश्यविधि में पैरामीटर पारित करना चाहिए और ओओपी में जितना संभव हो उतना उपयोग किया जाना चाहिए?

class page { 
    public $name; 
    public $title; 

    public function showhead() { 
      return "<head><title>".$this->title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->title = "My Page title"; 
$mypage->showhead(); 

और एक अन्य परिदृश्य

class page { 
    public $name; 
    public function showhead($title) { 
      return "<head><title>".$title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->showhead("My Page title"); 

इन तरीकों के अलावा, जो बेहतर है और जो बचा जाना चाहिए है? और क्यों?

+0

टाइपो? "से बचें और जितना संभव हो उतना उपयोग करें" - परिवर्तन और करने के लिए या? – apollodude217

उत्तर

8

मुझे लगता है कि यह इस बात पर निर्भर करता है कि आपको उस शीर्षक की फिर से आवश्यकता है या नहीं। यदि आप करते हैं तो भंडारण और पुनर्प्राप्ति के लिए संपत्ति बनाते हैं। अगर आपको केवल एक बार इसकी आवश्यकता है तो विधि पैरामीटर का उपयोग करें।

1

कोई अतिरिक्त जानकारी के बिना, मैं कहूँगा कि पहले एक है "बेहतर है," क्योंकि मुझे लगता है कि $name और $titlepage से संबंधित गुण हैं, इसलिए, यह एक वर्ग के सदस्य होना चाहिए। हालांकि, अगर आपको लगता है कि दूसरा संस्करण आपकी स्थिति पर अधिक लागू है, तो हर तरह से इसका इस्तेमाल करें।

5

आसपास के पैरामीटर (या तो व्यक्तिगत रूप से या अपरिवर्तनीय कुल प्रकारों में, जो वास्तव में PHP में मौजूद नहीं हैं) के बीच कुछ तनाव हमेशा होता है और उन्हें कहीं भी संग्रहीत करता है (चाहे वह वर्ग गुण, ग्लोबल्स, चाहे जो भी हो)। ओओपी के लाभों में से एक यह है कि आप ऑब्जेक्ट्स में राज्य को स्टोर कर सकते हैं और इंकैप्यूलेशन से लाभ प्राप्त कर सकते हैं (डेटा की कई आकस्मिक ओवरराइटिंग रोकता है) जबकि एक साथ चर के साथ प्रतीक तालिकाओं को प्रदूषित करने से परहेज करता है। इन परिवर्तनीय वस्तुओं का उपयोग करने से समस्याएं हैं, खासकर यदि हम बहु-थ्रेडेड प्रोग्रामिंग में जाते हैं, लेकिन यह PHP में एक छोटी सी चिंता है।

आपके विशेष मामले में, मुझे लगता है कि ऑब्जेक्ट में शीर्षक को स्टोर करना बेहतर होगा। इस रूप में सिलिको ने कहा, यह page के हैं लगता है, और उस के शीर्ष पर आप की तरह सामान कर सकते हैं:

$page = new page; 
$page->setTitle("whatever"); 
... 
function doStuff($page) { 
    ... 
    $page->showhead(); 
} 

और फिर आप शीर्षक के साथ एक साथ $page पारित करने के लिए नहीं है।

3

IMO: क्योंकि -> showhead() वस्तु से भी $ खिताब के लिए कम अर्थ संबंध नहीं है, तो आप $ शीर्षक assing चाहिए या तो संपत्ति, या वस्तु निर्माता के माध्यम से बेहतर रूप में:

class page { 
    function __construct($title="") { 
     $this->title = $title 
    } 

तो आप या तो new page("My page") या इसे बाद में $page->title=... असाइन कर सकते हैं, जब यह आपके पास उपलब्ध हो।

+0

और अधिक महत्वपूर्ण बात; अब आप संपत्ति को सुरक्षित घोषित कर सकते हैं और इस प्रकार वस्तु को अपरिवर्तनीय बना सकते हैं। – troelskn

1

सर्वोत्तम प्रथाओं के लिए एक तरफ ध्यान दें पर, यह एक अच्छा विचार सीधे वस्तु सदस्य का उपयोग नहीं करने के लिए हो सकता है, लेकिन इसके बजाय यह रक्षा की है और यह सेट/सार्वजनिक विधियों के माध्यम से यह बजाय मिलता है, इस

class foo 
{ 
    protected $title; 

    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 

    public function getTitle() 
    { 
     return $this->title; 
    } 
} 
की तरह कुछ

यह इस डेटा के साथ काम करने वाले किसी अन्य कोड की आवश्यकता को हटा देता है यह जानने के लिए कि वास्तव में इसे कैसे संग्रहीत किया जाता है और इसके बजाय डेटा को encapsulating (अलग) करने के बजाय इसके लिए एक इंटरफ़ेस प्रदान करता है। http://en.wikipedia.org/wiki/Information_hiding

3

आपको खुद से पूछना चाहिए: क्या शीर्षक किसी पृष्ठ से संबंधित है? या यह ऐसा कुछ है जो एक पृष्ठ का उपयोग करता है।
इन मुख्य heuristics मैं कैसे एक इकाई OOP में तैयार किया जा करने की जरूरत है पता लगाने के लिए उपयोग करते हैं:

  • Compisition का एक रिश्ता है-एक।क्या पृष्ठ है शीर्षक? इस प्रश्न का उत्तर हां है।
  • विरासत का एक रिश्ता है- है। पृष्ठ एक शीर्षक? इस प्रश्न का उत्तर नहीं है। ध्यान दें कि जब भी संभव हो, आपको विरासत पर संरचना पसंद करनी चाहिए। आमतौर पर आप उनमें से किसी एक का उपयोग कर सकते हैं।
  • किसी फ़ंक्शन में पैरामीटर पास करना का उपयोग करता है-। क्या पृष्ठशीर्षक का उपयोग करें? इस प्रश्न का उत्तर हां है। हालांकि है- एक मजबूत संबंध है तो उपयोग करता है-। कभी-कभी आप दोनों का उपयोग कर सकते हैं लेकिन आपको को से उपयोग करना चाहिए- संभव होने पर।
संबंधित मुद्दे