2009-07-16 12 views
10

के लिए यह $, self ::, parent :: का उपयोग करके मैं जानना चाहूंगा कि यह php कक्षाओं में काम करते समय स्वयं :: विधि() और parent :: method() का उपयोग करने के लिए स्वीकार्य/पसंदीदा है या नहीं।कोड पठनीयता

आप इस-> विधि() लेकिन $ $-> का उपयोग कर सकते हैं-> क्लास वेरिएबल, पैरेंट क्लास वैरिएबल या पैरेंट क्लास से एक विधि का भी उल्लेख कर सकते हैं। स्वयं में कोई अस्पष्टता नहीं है ::

क्या स्वयं :: वंचित और/या इस शैली का उपयोग करने के लिए कोई चेतावनी या विपक्ष है?

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

धन्यवाद।

जोड़ा एक उदाहरण: मान लिया जाये कि कई वेबसाइटों से इस आवेदन भंडार मंचों ...

class Forum_Controller extends Controller { 

    function __construct() 
    { 
     parent::__construct(); 
    } 

    function index() 
    { 
     echo self::categories(); 
    } 

/* 
* get a list of categories from a specific site. 
*/ 
    private function categories() 
    { 
     $db = new Database; 
     $categories = $db->query(" 
      SELECT * FROM 
      forum_categories 
      WHERE fk_site = '$this->site_id' 
     "); 
     $view = new View('categories_view'); 
     $view->categories = $categories; 
     return $view; 
    } 

} 

इस उदाहरण त्रुटि रिपोर्टिंग करने के लिए सेट के साथ kohana में काम करता है: error_reporting (E_ALL & ~ E_STRICT);

$ यह-> site_id को मुख्य नियंत्रक_Core क्लास (कोहाना में एक लाइब्रेरी) में परिभाषित किया गया है।

जहां तक ​​मुझे पता है, $ यह उपलब्ध नहीं होना चाहिए क्योंकि मैं स्वयं को :: श्रेणियों() को एक स्थिर तरीके से बुला रहा हूं, लेकिन यह केवल तभी होता है जब मैं श्रेणियों() को स्थैतिक मानता हूं कि यह एक त्रुटि फेंकता है ।

लेकिन जैसा कि मैंने कहा था कि मैं स्वयं को स्वयं :: का उपयोग करना पसंद करता हूं क्योंकि एक पठनीयता परिप्रेक्ष्य से, मुझे पता है कि यह फ़ंक्शन वास्तव में कहां होना चाहिए, इसके बजाय अस्पष्टता का कारण बनने के बजाय यह कार्य कहां होना चाहिए।

+1

कारण इस कोड काम करता है, क्योंकि आप कभी नहीं स्थिर बुलाया श्रेणियों विधि में वस्तु का इस उदाहरण एक $ की बात कर रहे के लिए स्वयं का उपयोग ::। – null

उत्तर

6

नियंत्रक कोहाना में स्थिर नहीं हैं, हालांकि उनमें स्थिर सदस्य चर/विधियां या स्थिरांक हो सकते हैं।

self:: लेखन ClassName:: यानी

class Animal 
{ 
    public static $arms = 0; 
} 

class Dog extends Animal 
{ 
    public static $leg = 0; 
    const NAME = 'dog'; 

    public static function bark() 
    { 
     echo 'Woof'; 
    } 
} 

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

तो:

Dog::bark(), 
Dog::$leg, 
Dog::NAME, 

हम भी

Animal::$arms 

वर्ग कुत्ता अंदर उपयोग कर सकते हैं हम self:: और parent:: उपयोग कर सकते हैं ताकि हम पूर्ण वर्ग के नाम टाइप करने के लिए (के रूप में यह कर सकता है की जरूरत नहीं है बहुत लंबा हो!)

हालांकि आपके प्रश्न के उत्तर में: नहीं - self:: को बहिष्कृत नहीं किया गया है और इसका उपयोग करने के लिए कोई बुरा अभ्यास नहीं है। कोहाना कोर में इसका उपयोग नहीं किया जाने वाला कारण बहुत अलग कारण के लिए है .... (अधिक जानकारी के लिए eval के साथ पारदर्शी कक्षा विस्तार नीचे पढ़ें ...)।

पी.एस गैर स्थिर तरीकों बुला स्थिर गलत है और अगर आप error_reporting(E_ALL | E_STRICT) सेट स्वीकृत- नहीं किया जाना चाहिए (जैसे आप विकास के दौरान चाहिए) तो आपको एक त्रुटि उठाया जा रहा देखेंगे।

असल में क्या होता है:

कोर एक फ़ाइल कहा जाता है:

class Controller_Core { 
    public function someMethod(){} 
} 

आप बनाते हैं:

// We can use someMethod of Controller_Core 
Index_Controller extends Controller {} 

यह वास्तव में Controller_Core जब तक आप MY_Controller बनाया है प्रदान कर रहा है .php जोहोगा 210।

//MY_Controller.php 
class Controller extends Controller_Core 
{ 
     // overloads Controller_Core::someMethod without us having to change the core file 
     public function someMethod(){} 
} 
+0

इसे समझाने के लिए समय निकालने के लिए धन्यवाद। यह बहुत ही उपयोगी है। अब मैं समझता हूं कि "स्टेटिक फ़ंक्शंस प्रति ऑब्जेक्ट प्रति ऑब्जेक्ट नहीं है" का मतलब है। मैं benlumley द्वारा प्रदान किए गए दस्तावेज को पढ़ूंगा, लेकिन मैं अभी भी इस तथ्य से परेशान हूं कि मेरा कोड अभी भी काम करता है: मैंने अपने प्रश्न के लिए कुछ उदाहरण कोड जोड़ा है, कृपया एक नज़र डालें। एक बार फिर धन्यवाद। – superjadex12

0

मुझे लगता है कि स्वयं :: स्थिर कार्यों और गुणों के लिए आमतौर पर उपयोग किया जाता है।

मैं कोहाना का उपयोग करता हूं, और शायद नियंत्रक स्थिर बनाते हैं।

16

एक अंतर है।

$this किसी ऑब्जेक्ट का एक उदाहरण संदर्भित करता है।

parent और self का उपयोग विधियों को स्थिर रूप से कॉल करने के लिए किया जाता है।

This page of PHP's manual इस समय लिखने का समय मेरे पास बेहतर विवरण में बताता है। विशेष रूप से पहला उदाहरण कुछ मतभेदों को उजागर करने में मदद कर सकता है। मैं आपको पहले उदाहरण और इसके बारे में गड़बड़ करने की प्रतिलिपि बनाने के लिए प्रोत्साहित करता हूं, क्योंकि मुझे लगता है कि यदि आप पहले से ही अंतर नहीं जानते हैं तो यह आपके दिमाग में एक महत्वपूर्ण अवधारणा है।

+0

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

+0

अभिभावक (केवल) विधिवत रूप से विधि कॉल करने के लिए उपयोग नहीं किया जाता है। यदि इसे ऑब्जेक्ट संदर्भ से कहा जाता है, तो यह ऑब्जेक्ट संदर्भ के साथ पैरेंट क्लास में फ़ंक्शन को कॉल करेगा। –

0

मैं एक टिप्पणी (जाहिरा तौर पर मैं आवश्यक प्रतिनिधि नहीं है!)

class Forum_Controller extends Controller { 

public function __construct() 
{ 
    parent::__construct(); 
} 

public function index() 
{ 
    echo self::categories(); 
} 

/* 
* get a list of categories from a specific site. 
*/ 
private static function categories() 
{ 
    $db = new Database; 

    // You cannot use $this in a static function, because static functions are per class 
    // and not per object it doesnt know what $this is :) (make private static $site_id and use self::$site_id) if this is what you want 

    $categories = $db->query(" 
      SELECT * FROM 
      forum_categories 
      WHERE fk_site = '$this->site_id' 
    "); 
    $view = new View('categories_view'); 
    $view->categories = $categories; 
    return $view; 
} 

}

जैसा कि मैंने कहा, आप error_reporting का उपयोग करना चाहिए नहीं जोड़ सकता है (E_ALL | E_STRICT) ;) निजी समारोह श्रेणियों बुला (स्थिर PHP में बग के कारण काम करता है

(kohana फ़ाइल में इसे बदल), तो आपको क्या करना है यह

0

एक और बात :) वैसे नोट करने के लिए सक्षम नहीं होना चाहिए है कि यह स्थिर नियंत्रक कार्यों को बनाने के लिए बहुत अच्छा एमवीसी डिज़ाइन नहीं है जो श्रेणियों की सूचियां लौटाता है।

नियंत्रक अनुरोधों से निपटने के लिए हैं, मॉडल डेटा से निपटने के लिए हैं (जो यह है) और दृश्य प्रदर्शन के लिए हैं।

एक मॉडल बनाएं!

class Category_Model extends Model 
{ 
     public function categories($site_id) 
     { 
      $categories = $this->db->from('forum_categories')->where('fk_site',$site_id)->get(); 

       return new View('categories_view', array('categories' => $categories)); 
     } 
} 

...

$cat = new Category_Model; 

echo $cat->categories(1); 
0

मैं सख्ती से केवल स्थैतिक चर और स्थिर सदस्य समारोह

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