2012-05-01 14 views
8

संभव डुप्लिकेट:
PHP: Static and non Static functions and ObjectsPHP में, मैं एक स्थैतिक तरीके से गैर स्थैतिक विधि तक पहुंचने में सक्षम क्यों हूं?

निम्न कोड में, nonStatic() एक स्थिर तरीका नहीं है। फिर भी मैं एक वस्तु (एक स्थिर तरीके से) के बिना इसे एक्सेस करने में सक्षम हूं। क्या कोई मुझे समझने में मदद कर सकता है क्योंकि यह जावा जैसी अन्य भाषाओं में संभव नहीं है?

<?php 
class MyClass 
{ 
    function nonStatic() { 
     echo "This can be printed"; 
    } 
} 
MyClass::nonStatic(); // This can be printed 
+4

क्योंकि ओओ अवधारणाओं को PHP पर बाद में विचार के रूप में बोल्ड किया गया था? गंभीरता से, PHP, ओओपी अध्ययन के लिए एक मॉडल नहीं है। – DGM

+0

आप इसे स्थिर रूप से कॉल कर सकते हैं जब तक कि इसमें इंस्टेंस संदर्भ ('$ this') शामिल न हों। सुनिश्चित नहीं है कि आपको 'E_STRICT' के तहत चेतावनियां मिलेंगी (मुझे आशा है कि आप ऐसा करेंगे)। –

+0

मैं इस बात से सहमत नहीं हूं कि यह एक डुप्लिकेट है क्योंकि इस प्रश्न में कम से कम –

उत्तर

0

सुनिश्चित नहीं है, शायद कुछ PHP जादू (यह कभी-कभी ऐसा ही होता है), लेकिन आपको यह नहीं करना चाहिए।

अधिक यहाँ http://php.net/manual/en/language.oop5.static.php

उन्होंने यह भी एक ऐसी ही उदाहरण दिखाते हैं, लेकिन ध्यान दें पढ़ें:

कॉलिंग गैर स्थिर तरीकों स्थिर एक E_STRICT स्तर चेतावनी अर्थ यह जादू की क्षमता भविष्य के संस्करणों में गायब हो सकता है उत्पन्न करता है। तो ऐसा मत करो :)

+1

बेहतर स्पष्टीकरण हैं, आम तौर पर, यदि संभव हो तो PHP प्रयास करता है, क्रैश नहीं होता है और अनावश्यक होता है। उनके उदाहरण में, कुछ भी स्थैतिक नहीं किया जाता है, और इसके कारण, विधि प्रभावी रूप से स्थैतिक है। इसके बारे में सोचने का दूसरा तरीका स्थिर है यह सुनिश्चित करने के लिए php प्राप्त करने का एक तरीका है कि आपने यह सुनिश्चित करने के लिए $ को कॉल नहीं किया है क्योंकि विधि का उपयोग स्थिर रूप से किया जाना है - वैसे भी अन्य सभी भाषाएं वैसे भी होती हैं। यह सिर्फ एक निर्माण है।PHP एक बार में संकलित और निष्पादित करता है, क्योंकि यह एक स्क्रिप्ट भाषा है, इसलिए इसमें अधिक लचीलापन है और यह सामान्य रूप से घातक त्रुटि को चेतावनी में बदल देता है - संभव है। –

2

ऐसा लगता है कि PHP के डेवलपर्स को गैर स्थैतिक तरीकों की स्थिर पहुंच को अस्वीकार करने में कोई मूल्य नहीं दिखता था। यह PHP की उन मूर्खतापूर्ण विशेषताओं में से एक है जो वास्तव में एक उद्देश्य प्रदान नहीं करता है। यह निश्चित रूप से एक गैर स्थैतिक विधि को स्थिर रूप से कॉल करने के लिए खराब प्रोग्रामिंग अभ्यास है, लेकिन PHP में यह संभव है। शायद PHP के भविष्य के संस्करण में वे इसे अस्वीकार कर देंगे, लेकिन अभी के लिए, यह सिर्फ भाषा का हिस्सा है।

संपादित करें:

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

+1

विपरीत * है * वास्तव में अनुमति है; यह सुनिश्चित नहीं है कि यह अच्छा है या बुरा है ;-) –

+0

मुझे उसको सतर्क करने के लिए धन्यवाद, जैक! मैंने अपनी टिप्पणी अपडेट की है। – Andrew

6

यह अनुमति दी है, लेकिन यह एक E_STRICT चेतावनी उत्पन्न करता है:

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context 

पीएचपी के पूर्व OO कार्यान्वयन इस चुपचाप अनुमति दी गई थी में, लेकिन बेहतर प्रथाओं के बाद से अपनाया गया है।

एक अड़चन हालांकि बिना विपरीत काम करता है:

class Test 
{ 
    function foo() 
    { 
     echo $this->bar(); 
    } 

    static function bar() 
    { 
     return "Hello world\n"; 
    } 
} 

$x = new Test; 
$x->foo(); 

यह प्रिंट Hello world

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