2012-06-23 20 views
12

मुझे लगभग बनाने की आवश्यकता है। 5-7 कक्षाएं, प्रत्येक वर्ग में बहुत से सदस्य होंगे (हम कहते हैं कि प्रत्येक वर्ग में 20 सदस्य होंगे)। मैं उन्हें सार्वजनिक पहुंच का उपयोग कर बना सकता हूं, जैसे:PHP ओओपी बहुत सारे सेटर्स, गेटर्स

class A { 
    public $myPropertyOne = ''; 
    public $myPropertyTwo = ''; 
    ... 
} 

इन सदस्यों को निजी बनाने और प्रत्येक संपत्ति के लिए प्राप्त/सेट विधियां बनाने का मेरा पसंदीदा तरीका है। अर्थात।

class A { 
    private $myPropertyOne = ''; 
    private $myPropertyTwo = ''; 

    public function getMyPropertyOne() { 
      return $this->myPropertyOne; 
    } 

    public function setMyPropertyOne($myPropertyOne) { 
      $this->myPropertyOne = $myPropertyOne; 
    } 

    public function getMyPropertyTwo() { 
      return $this->myPropertyTwo; 
    } 

    public function setMyPropertyTwo($myPropertyTwo) { 
      $this->myPropertyTwo = $myPropertyTwo; 
    } 
} 

लेकिन कक्षा में विचार करने के लिए 20 गुण होंगे, मेरे पास 40 तरीके जोड़ने के अलावा होगा। और यहां मेरी चिंता यह है कि यह स्क्रिप्ट को धीमा कर देगा और इसके लिए बहुत अधिक मेमोरी की आवश्यकता होगी (याद रखें कि मुझे इस तरह के कई वर्ग होने जा रहे हैं)।

एक और समाधान जादू कार्यों __set, __get का उपयोग करने के लिए हो सकता है, लेकिन मैं नहीं चाहता, क्योंकि विकास आईडीई में कोड पूर्णता मेरे लिए महत्वपूर्ण गुणों का सुझाव नहीं देगी।

यदि यह एक संकलित भाषा (सी ++ की तरह) होगी तो मेरे पास कोई प्रश्न नहीं होगा और गेटर्स, सेटर्स के साथ समाधान का उपयोग करेगा, लेकिन चूंकि PHP की भाषा का अर्थ है, इसलिए मुझे अपनी रैप में दिलचस्पी है और कम रैम का उपयोग करना है जितनी जल्दी हो सके।

अग्रिम धन्यवाद, इस प्रश्न के बारे में किसी भी विचार की बहुत सराहना की जाएगी!


मेरे राय

आप सभी अपने जवाब के लिए धन्यवाद, मैं सिर्फ मामले में किसी को मेरी राय साझा करने के लिए इस प्रश्न का उत्तर के लिए दिखेगा चाहता था।

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

तो .... मेरी राय यह है कि सभी सदस्यों के लिए सार्वजनिक पहुंच का उपयोग करना और सभी गुणों के लिए गेटर्स/सेटर्स से बचने और संपत्तियों के लिए प्राप्त/सेट विधियों के साथ निजी पहुंच का उपयोग करना है जिसके लिए डेटा सत्यापन या प्रारंभिक आवश्यकता है एक मूल्य निर्धारित करने से पहले।

उदाहरण के लिए:

class B { 
    public $myPropertyOne = ''; 
    public $myPropertyTwo = ''; 
    private $myPropertyThree = array(); 


    public function getMyPropertyThree() { 
     return $this->myPropertyThree; 
    } 

    public function setMyPropertyThree($val) { 
     if(!is_array($val)) { 
      return; 
     } 

     $this->myPropertyThree = $val; 
    } 
} 

मेरे सवाल पर समय बिताने के लिए धन्यवाद!

+14

यह एक माइक्रो-ऑप्टिमाइज़ेशन है, और आपको इसके बारे में चिंता नहीं करना चाहिए। –

+0

ठीक है, हाँ, लेकिन 280 जोड़ने के लिए एक परिप्रेक्ष्य विधियों (7 कक्षाओं, 20 निजी सदस्यों के लिए) बस इसके लिए मुझे स्मृति/गति दृष्टिकोण से थोड़ा डराता है। और मान लें कि सिस्टम बढ़ता है और मैं उन वर्गों को 15 की गिनती तक बढ़ा दूंगा .. फिर मुझे 600 तरीके मिलेंगे। दूसरी तरफ मुझे एहसास है कि ये प्राप्त/सेट विधियों को केवल तभी निष्पादित किया जाएगा जब एक ही समय में मुझे लगता है कि जब PHP स्रोत कोड का विश्लेषण करेगा तो यह स्मृति में विधियों की एक तालिका का निर्माण करेगा, वाक्यविन्यास विश्लेषण करेगा और यह सब हो सकता है स्क्रिप्ट के काम को धीमा कर दें, क्या मेरा धारणा सही है? – user1476490

+1

मेमोरी अपेक्षाकृत सस्ता है और विधि ओवरहेड प्रति कक्षा (प्रति उदाहरण नहीं) है। PHP भी उसी प्रक्रिया में एकाधिक अनुरोधों को संभालने की तरह चाल करता है mod_php, आदि) तो शुरुआती लोड समय (जितना छोटा हो सकता है) पूरी तरह से अनदेखा किया जा सकता है ... किसी भी मामले में, * बेंचमार्क पहले * (वास्तविक स्थितियों के तहत) यह देखने के लिए कि सिस्टम के "धीमे" भाग क्या हैं। (एफडब्ल्यूआईडब्लू, मान लीजिए कि 600 विधियां हैं, और प्रत्येक विधि "कचरे" 1 किलो है। एक विशाल 600 केबी "बर्बाद" है। वास्तव में चीजों की योजना में इतना अधिक नहीं है ... विशेष रूप से यह मानते हुए कि PHP में प्रत्येक चर * प्रत्येक चर * अपशिष्ट ";-) –

उत्तर

5

सरल परीक्षण उदाहरणों स्मृति का एक ही राशि, एक कक्षा में तरीकों की संख्या से अप्रभावित ले दिखाता है:

कोई तरीकों के साथ कक्षा:

class Test1 { } 

20 तरीकों के साथ कक्षा:

class Test2 { 

    function test1() { return true; } 
    function test2() { return true; } 
    function test3() { return true; } 
    function test4() { return true; } 
    function test5() { return true; } 
    function test6() { return true; } 
    function test7() { return true; } 
    function test8() { return true; } 
    function test9() { return true; } 
    function test10() { return true; } 
    function test11() { return true; } 
    function test12() { return true; } 
    function test13() { return true; } 
    function test14() { return true; } 
    function test15() { return true; } 
    function test16() { return true; } 
    function test17() { return true; } 
    function test18() { return true; } 
    function test19() { return true; } 
    function test20() { return true; } 

} 

टेस्ट लूप, दोनों परीक्षणों के लिए समान:

$test = array(); 
$base = memory_get_usage(); 
for ($i = 0; $i < 10000; $i++) { 
    $test[] = new ClassToBeTested(); 
} 
$used = memory_get_usage() - $base; 
print("used: $used\n"); 
वर्ग Test1 के लिए

परिणाम (कोई विधि):

used: 3157408 

वर्ग Test2 के लिए परिणाम (20 तरीकों):

used: 3157408 

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

जबकि आप निश्चित रूप से वास्तविक वर्ग परिभाषा के लिए और अधिक स्मृति लेते हैं, जाहिर है कि यह लागत प्रति वर्ग केवल एक बार होती है, प्रति उदाहरण नहीं। आपको स्मृति उपयोग के बारे में चिंता करने की ज़रूरत नहीं है।

+0

दुर्भाग्य से मैं यहां बहुत सारे कोड पेस्ट नहीं कर सकता लेकिन यहां मैंने जो किया है। मैंने test1.php को एक वर्ग के साथ बनाया, फिर test2.php को कक्षा और एक विधि के साथ, और फिर test3.php कक्षा, 20 निजी गुणों और फिर 40 सार्वजनिक प्राप्त/सेट विधियों (सभी रिटर्न के साथ, आदि) के साथ बनाया।)। और उत्पादन की कुल इस्तेमाल किया अंत में राम, तो यहाँ मैं क्या मिला है: 'test1.php - 653.97 Kbytes' ' test2.php - 654.73 Kbytes' 'test3.php - 718.16 Kbytes' यह किसी न किसी तरह है, लेकिन मूल रूप से मुझे लगता है कि प्रत्येक विधि/वेरिएबल डेटा को गिनती नहीं कर रहा है, ~ 1 केबी खाता है। – user1476490

5

लेकिन एक वर्ग पर विचार 20 गुण

इस कई गुण होने आमतौर पर गलत जानकारी का सूचक है होगा। जांचें कि क्या आप उनमें से कुछ को अपनी कक्षाओं में समूहित कर सकते हैं।

मैं इस के अलावा होगा 40 तरीकों जोड़ें।

बिलकुल नहीं। जब तक ये कक्षाएं गूंगा डेटा structs नहीं हैं, आप उन पर कोई गेटर्स और सेटर्स नहीं चाहते हैं क्योंकि वे encapsulation तोड़ते हैं। सार्वजनिक एपीआई में विधियों को रखो जिसके साथ आप वस्तुओं को करने के लिए वस्तुओं को बताते हैं।

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

यह कोई मुद्दा नहीं है।

एक अन्य समाधान जादू कार्यों का उपयोग करने के लिए हो सकता है __set, __get लेकिन मैं, विकास आईडीई में कोड पूरा होने के गुण का सुझाव नहीं होगा, क्योंकि करने के लिए जो मेरे लिए महत्वपूर्ण है नहीं करना चाहती ।

आधुनिक आईडीई जादू विधियों पर स्वत: पूर्ण हो सकते हैं।

हालांकि, अगर आप पहले से ही microlevel में प्रदर्शन को लेकर चिंतित हैं, तो आप जादू तरीकों चाहते हैं, क्योंकि उन निश्चित रूप से कम होती है।

कि से

अलावा, जादू के तरीके getters और setters लेकिन त्रुटि संचालकों कि शुरू हो रहा हो जब एक दुर्गम संपत्ति या विधि बुलाया गया था के लिए विकल्प नहीं हैं।

इसके अलावा, जादू तरीकों unobvious कर रहे हैं और पढ़ने के लिए कठिन एपीआई हैं।

+0

आपकी विस्तृत प्रतिक्रिया के लिए धन्यवाद। – user1476490

0

मन में लें कि मेरे कोड माना जाता है कि गुण 'नाम छोटे अक्षरों में घोषित किया गया है ...

<?php 

    class Modelo { 
     var $attr1 = "default"; 
     var $attr2 = 0; 


     public function __call($name, $arguments) 
     { 
      if (method_exists($this, ($method = $name))){ 
       return $this->$method(); 
      } 
      else{  
       $attribute = split("get",$name); 
       if(count($attribute)==2){ 
        $attribute = strtolower($attribute[1]); 
        if(isset($this->$attribute)){ 
         return ($this->$attribute); 
        } 
       }else{ 
        $attribute = split("set",$name); 
        if(count($attribute)==2){ 
         $attribute = strtolower($attribute[1]); 
         if(isset($this->$attribute) && count($arguments)==1){ 
          $this->$attribute=$arguments[0]; 
         }else{ 
          die("$name number of arguments error: ".join($arguments,",")); 
         } 
        }else{ 
         die("$name doesn't exist!"); 
        }    
       }   
      } 
     } 


    } 

    echo "<pre>"; 
    $m = new Modelo(); 
    print_r(
     array(
      "objetct"=>$m 
      ,"getAttr1"=>$m->getAttr1() 
      ,"getAttr2"=>$m->getAttr2() 
     ) 
    ); 
    echo "setAttr1\n"; 
    $m->setAttr1("by set method"); 
    print_r(
     array(
      "objetct"=>$m 
      ,"getAttr1"=>$m->getAttr1() 
      ,"getAttr2"=>$m->getAttr2() 
     ) 
    ); 

    ?> 
+0

धन्यवाद, लेकिन इस मामले में ग्रहण या नेटबीन में कोड समापन कैसे कहेंगे? – user1476490

0

जैसा कि पहले कहा गया है, यह काफी अजीब है कि अपने वर्ग के साथ इतने सारे गुण होना चाहिए। हालांकि, यह कभी-कभी (शायद ही कभी शायद) हो सकता है। लेकिन आम तौर पर, उन गुणों के साथ एक साथ लिंक होना चाहिए: ताकि आप उन्हें एक हैशप में स्टोर कर सकें, न कि संपत्ति। फिर आप एक गेटटर के रूप में एक विधि की पुष्टि की।

अब, यह निश्चित रूप से अधिक संसाधन उपभोग करने वाला, सत्य होगा। स्वतः पूर्णता के लिए के रूप में, स्थिरांक का उपयोग करें: के रूप में यह वर्ग में संग्रह किया गया है

$my_class->getFromHashMap($parameter) 

और जब आपके पैरामीटर टाइपिंग, आप निरंतर उपयोग करेंगे:: तुम सिर्फ तरह कुछ टाइप करता हूँ यहाँ, स्वत: पूर्ण करने में मदद करने में सक्षम होना चाहिए आप।

+0

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

+0

डेटा सत्यापन से अलग, आपके हैशैप के लिए कुंजी के रूप में स्थिरांक का उपयोग करके आप जिस समस्या का वर्णन कर रहे हैं उसे हल करना चाहिए (और आप अपने सेटर्स में भी रोक सकते हैं, जो कि आपके स्थिरांक में परिभाषित नहीं है)। – Raveline

0

इस तरह अपनी कक्षा के गुणों कि जादू तरीके से लागू किया आईडीई द्वारा हाइलाईट किए जा करने के लिए सिर्फ @property phpdoc का उपयोग @property टैग, करने के लिए:

phpdoc '@property यहाँ पर
<?php 
/** 
* @property int id Blog post ID 
* @property string title Blog post Title 
*/ 
class Post { 

} 

अधिक: http://manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/tutorial_tags.property.pkg.html

अन्य मुद्दों के लिए पूछे जाने पर - करॉली होर्वथ की टिप्पणी पूरी तरह से उन PHP OOP a lot of setters, getters को कवर करती है।

0

आप इस कोशिश कर सकते:

विशेषता {

public function set($what, $value) 
{ 
    $this->{$what} = $value; 
} 

public function get($what) 
{ 
    return $this->{$what}; 
} 

}

यह काम करेंगे get_set सार्वजनिक और संरक्षित चर पर। यदि आप (! Isset ($ this -> {$ what}) त्रुटि जोड़ सकते हैं()

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