मैं इस प्रश्न के प्रारूप के साथ कुछ करने की कोशिश कर रहा हूं और मैं इसे संभालने के बेहतर तरीके के बारे में सुझावों के लिए बहुत खुला हूं।क्या PHP वर्ग में गेटर्स/सेटर्स को संभालने का यह एक उचित तरीका है?
मैं इस प्रश्न में कोड का एक गुच्छा डंप नहीं करना चाहता था इसलिए मैंने कक्षा के लिए कोड को refactormycode पर पोस्ट किया है।
base class for easy class property handling
मेरे बारे में सोचा है कि लोगों को भी कर सकते हैं पोस्ट कोड यहाँ के टुकड़े या उनके refactorings को refactormycode और बाद लिंक पर परिवर्तन कर रहा था। मैं अपवॉट कर दूंगा और उस पर आधारित एक जवाब स्वीकार करूँगा (माना जाता है कि एक स्पष्ट "विजेता" है)।
किसी भी दर, वर्ग ही पर:
मैं गेटर/सेटर वर्ग के तरीकों के बारे में बहस का एक बहुत देखते हैं और यह बेहतर बस सीधे सरल संपत्ति चर तक पहुँचने के लिए या हर वर्ग स्पष्ट प्राप्त/सेट होना चाहिए है विधियों परिभाषित, ब्ला ब्ला ब्लाह। यदि आपको बाद में अधिक तर्क जोड़ना है तो मुझे स्पष्ट तरीकों के बारे में विचार पसंद है। फिर आपको कक्षा का उपयोग करने वाले किसी भी कोड को संशोधित करने की आवश्यकता नहीं है। हालांकि मैं एक लाख कार्यों कि इस तरह दिखना होने से नफरत है:
public function getFirstName()
{
return $this->firstName;
}
public function setFirstName($firstName)
{
return $this->firstName;
}
अब मुझे यकीन है कि मैं इस (मैं आशा करती हूं कि किसी को यह कर सकते हैं यह करने का एक बेहतर तरीका है कि ऐसा करने के लिए पहले व्यक्ति नहीं हूँ हूँ मुझे सुझाव दें)।
असल में, प्रॉपर्टी हैंडलर क्लास में __call जादू विधि है। "Get" या "set" से शुरू होने वाले __call के माध्यम से आने वाली कोई भी विधि तब उन फ़ंक्शंस पर जाती है जो किसी एसोसिएटिव सरणी में मान सेट या पुनर्प्राप्त करती हैं। सरणी में कुंजी कॉल या सेट के बाद कॉलिंग विधि का नाम है। इसलिए, यदि __call में आने वाली विधि "getFirstName" है, तो सरणी कुंजी "फर्स्टनाम" है।
मुझे __call का उपयोग करना पसंद आया क्योंकि यह स्वचालित रूप से उस मामले का ख्याल रखेगा जहां सबक्लास के पास पहले से ही "getFirstName" विधि परिभाषित है। मेरी धारणा (और मैं गलत हो सकता हूं) यह है कि __get & __set जादू विधियां ऐसा नहीं करती हैं।
तो यहाँ है कि यह कैसे काम करेगा का एक उदाहरण है:
class PropTest extends PropertyHandler
{
public function __construct()
{
parent::__construct();
}
}
$props = new PropTest();
$props->setFirstName("Mark");
echo $props->getFirstName();
सूचना है कि PropTest वास्तव में "setFirstName" या "getFirstName" विधियां नहीं हैं और न PropertyHandler करता है। जो कुछ भी कर रहा है वह सरणी मानों में हेरफेर कर रहा है।
दूसरा मामला वह होगा जहां आपका सबक्लास पहले से ही कुछ और विस्तार कर रहा है। चूंकि आप PHP में वास्तविक एकाधिक विरासत नहीं प्राप्त कर सकते हैं, इसलिए आप अपने सबक्लास को एक निजी चर के रूप में एक संपत्ति हैंडलर उदाहरण बना सकते हैं। आपको एक और फ़ंक्शन जोड़ना होगा लेकिन फिर चीजें ठीक उसी तरह व्यवहार करती हैं।
class PropTest2
{
private $props;
public function __construct()
{
$this->props = new PropertyHandler();
}
public function __call($method, $arguments)
{
return $this->props->__call($method, $arguments);
}
}
$props2 = new PropTest2();
$props2->setFirstName('Mark');
echo $props2->getFirstName();
सूचना कैसे उपवर्ग एक __call विधि है कि बस PropertyHandler __call विधि के साथ सब कुछ गुजरता है।
गेटर्स और सेटर्स को संभालने के खिलाफ एक और अच्छा तर्क यह है कि यह दस्तावेज़ को वास्तव में कठिन बनाता है।
असल में, किसी भी तरह के दस्तावेज़ जनरेशन टूल का उपयोग करना मूल रूप से असंभव है क्योंकि दस्तावेजों को दस्तावेज करने के लिए स्पष्ट तरीके मौजूद नहीं हैं।
मैं काफी अब के लिए इस दृष्टिकोण त्याग दिया है। यह एक दिलचस्प सीखने का अभ्यास था, लेकिन मुझे लगता है कि यह बहुत स्पष्टता बलिदान देता है।
जिज्ञासा से, अब आप किस विधि का उपयोग करते हैं? – SeanJA
एक ही कक्षा में गेटर्स ** और ** सेटर्स होने का संकेत यह है कि कक्षा में इसका कोड गुम है। उस कोड की जांच करें जो वर्ग 'गेटर्स और सेटर्स का उपयोग करती है और इसे कक्षा के अंदर ले जाती है क्योंकि यह वह जगह है जहां यह संबंधित है। – axiac