2012-05-26 36 views
25

में स्थिर नहीं बुलाया जाना चाहिएमैं "गैर-स्थैतिक विधि xxx कैसे हल कर सकते हैं: xxx() वर्तमान में PHP में एक बड़े मंच का उपयोग कर PHP 5.4

सर्वर उस पर हाल ही में पीएचपी 5.4 करने के लिए उन्नत किया गया है होस्ट किया गया है। ।

, जब से मैं जैसे कई त्रुटि संदेश प्राप्त किया है:

[शनि मई 26 19:04:41 2012] [त्रुटि] पीएचपी सख्त मानकों: गैर स्थिर विधि कॉन्फ़िग :: GetData() लाइन 35

पर /xxx/Config.inc.php में असंगत संदर्भ से इसे $ मानते हुए स्थिर रूप से नहीं कहा जाना चाहिए

उदाहरण विधि के रूप में परिभाषित किया गया है ('स्थिर' कीवर्ड की कमी पर ध्यान दें):

function &getData() { 
      $configData =& Registry::get('configData', true, null); 

    if ($configData === null) { 
     // Load configuration data only once per request, implicitly 
     // sets config data by ref in the registry. 
     $configData = Config::reloadData(); 
    } 

    return $configData; 
} 

यह कोई पहले एक समस्या का कारण है, और मैं त्रुटि संदेश (जो दुर्घटना का कारण आवेदन मान) हाल ही में PHP5.4 के अपग्रेड से संबंधित हो सकता है।

क्या कोई PHP सेटिंग है जो मैं स्थिर कीवर्ड की कमी को अनदेखा करने के लिए संशोधित कर सकता हूं?

+0

कॉन्फ़िगर का एक उदाहरण बनाएं और इसे GetData() से कॉल करें – Musa

+0

क्या आप 'और getData()' की सामग्री का नमूना शामिल कर सकते हैं? विशेष रूप से, वास्तव में क्या लौटाया जा रहा है और कैसे। –

+0

मूल प्रश्न में getData() की सामग्री को जोड़ा गया - मुझे हालांकि जोर देना चाहिए कि यह त्रुटि केवल 5.4 तक अपग्रेड के बाद उठाई गई है, इसलिए मुझे विश्वास है कि तर्क ठीक है – kaese

उत्तर

39

आप या तो को error_reporting() से हटा सकते हैं, या यदि आप इसे स्थिर रूप से कॉल करने की आवश्यकता है, तो आप बस अपनी विधि स्थिर कर सकते हैं। जहां तक ​​मुझे पता है, वहां कोई विधि (सख्त) तरीका नहीं है जिसकी विधि स्थिर और गैर स्थैतिक विधि दोनों के रूप में लागू की जा सके। इसके अलावा, जो अधिक परेशान है, आपके पास एक ही नाम के साथ दो विधियां नहीं हो सकती हैं, एक स्थिर और अन्य गैर स्थैतिक है।

+0

धन्यवाद lanzz - यह मेरा विचार भी है। मैं उन्हें पूरी तरह स्थैतिक बनाने में संकोच करता हूं क्योंकि मुझे अनिश्चितता है कि उन्हें गैर-स्थैतिक संदर्भ से भी बुलाया जाता है। मैं त्रुटि_ रिपोर्टिंग() से E_STRICT को हटाने का प्रयास करूंगा और आपको वापस ले जाऊंगा। धन्यवाद। – kaese

+0

आपके getData() कार्यान्वयन के साथ, गैर स्थैतिक संदर्भ में कॉल करने की आवश्यकता नहीं होगी, क्योंकि यह किसी भी तरह से इंस्टेंस डेटा में हेरफेर नहीं करता है; और यदि यह उदाहरण डेटा के साथ काम करता है, तो आप इसे स्थिर संदर्भ में कॉल करने में सक्षम नहीं होंगे। – lanzz

+0

धन्यवाद lanzz - हालांकि वही चेतावनी फेंकने के अन्य तरीके हैं जिन्हें गैर-स्थैतिक कहा जा सकता है। त्रुटि_ रिपोर्टिंग() में सख्त त्रुटियों को बंद करने के आपके सुझाव ने इस मुद्दे को दबा दिया है। धन्यवाद! – kaese

-5

मैं एक कोड लाइन के साथ इस हल, इस प्रकार: फ़ाइल index.php में, अपने टेम्पलेट जड़ में, इस कोड को पंक्ति के बाद:

परिभाषित ('_JEXEC') या मर ('प्रतिबंधित पहुंच') ;

इस लाइन को पेस्ट करें: ini_set ('display_errors', 'off');

चिंता न करें, खुश हो ...

Jenio द्वारा पोस्ट की गई।

+3

यह सभी त्रुटियों को छुपाएगा। सुरक्षा विचारों के लिए उपयोगकर्ता को त्रुटियों को न दिखाने का अच्छा विचार है, हालांकि वे अभी भी लॉग फ़ाइलों में या विकास करते समय दिखाई दे सकते हैं। अन्य, असली, समस्याएं इस दृष्टिकोण से अनजान हो सकती हैं। – amoebe

+0

यह किसी भी समस्या का समाधान नहीं करेगा और अन्य मुद्दों को पहचानने के लिए कठिन बना देगा। –

+0

एक व्यस्त वेबसाइट पर, आपके पास हर दिन 100% एमबी लॉग डेटा ('error_log' फ़ाइल) हो सकता है यदि आप उन्हें प्रदर्शित नहीं करते हैं (HTML फ़ाइल/क्लाइंट में) लेकिन फिर भी उन्हें सक्षम करें (PHP में 'E_STRICT'' हो)। मेरे साथ भी हुआ। – Ned64

23

चेतावनी संदेश को अक्षम करना समस्या को हल करने का कोई तरीका नहीं है। PHP कोर काम जारी रखने के बावजूद यह एक खतरनाक धारणाओं और कार्यों को बनाता है।

त्रुटि को अनदेखा न करें जहां PHP को कुछ की धारणाएं बनाना चाहिए !!!!

तो वर्ग एक सिंगलटन आप हमेशा समारोह getInstance() का उपयोग कर सकते हैं और फिर GetData()

Likse का उपयोग के रूप में आयोजित:

$classObj = MyClass::getInstance(); 
$classObj->getData(); 

वर्ग एक सिंगलटन, उपयोग नहीं है, तो

$classObj = new MyClass(); 
$classObj->getData(); 
4

मुझे सलाह नहीं है कि आप बस अपनी परियोजना पर गलियों की त्रुटियों को छिपाएं। intead, आप स्थिर करने के लिए अपने विधि देते हैं या वस्तु का एक नया उदाहरण creat करने के लिए प्रयास करना चाहिए:

$var = new YourClass(); 
$var->method(); 

तुम भी पीएचपी 5.4 के बाद से ही करने के लिए नया तरीका का उपयोग कर सकते हैं:

(new YourClass)->method(); 

मुझे उम्मीद है इससे आपको मदद मिली होगी!

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