2009-09-01 14 views
6

शामिल यह काम नहीं करता:विस्तारित वर्ग नहीं मिला जब बेस वर्ग एक अलग में है फ़ाइल

test.php:

include_once('test-include.php'); 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
    } 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

परीक्षण include.php:

// this does get printed out, so I know the include statement is working 
echo 'DEBUG: this is the test-include.php file<br>'; 

//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

यह निम्नलिखित त्रुटि देता है

PHP Fatal error: Class 'Test2' not found in /path/to/test.php on line 8 
इस जबकि

काम करता है

test2.php:

// this is in the same position as the include statement in test.php 
//====================================================================== 
class Test1 { // test1 
    var $var = 'a'; 
} 

$main = new mainClass(); 

//====================================================================== 
class mainClass { 
    function __construct() { 
     $test2 = new Test2(); 
     echo $test2->var; 
} 
} 

//====================================================================== 
class Test2 extends Test1 { // test2 
    var $var = 'b'; 
} 

क्यों बच्चे वर्ग है कि यह विस्तार नहीं पाया जा करने के लिए एक में शामिल फ़ाइल में बेस वर्ग (Test1) डालने का कारण नहीं है ? दूसरे शब्दों में, पहला उदाहरण विफल रहा है क्योंकि जब हम इसे तुरंत चालू करने का प्रयास करते हैं तो यह टेस्ट 2 नहीं ढूंढ सकता है। इस तरह की समझ में आता है क्योंकि हम कोड निष्पादन प्रवाह में अभी तक टेस्ट 2 तक नहीं पहुंच पाए हैं। हालांकि, दूसरे उदाहरण में (शामिल कथन के बिना) कोई त्रुटि नहीं है, भले ही यह एक समान स्थिति है (हम कोड निष्पादन में टेस्ट 2 कक्षा तक नहीं पहुंच पाए हैं)

ओह, और यह संस्करण 5.1.6 के तहत है ।

अद्यतन:

ठीक है, Daff सही है - अगर मैं test.php उदाहरण में समाप्त करने के लिए

$main = new mainClass(); 

ले जाते हैं, यह काम करता है। मैं अभी भी जानना चाहूंगा कि उपर्युक्त रेखा अंत में क्यों नहीं है - यह test2.php उदाहरण में ठीक काम करता है जिसमें अंत में $ main = new mainClass() लाइन नहीं है ।

अद्यतन 2:

ठीक है, मैं include_once के स्थान पर require, require_once और include का उपयोग कर की कोशिश की है - इन में से कोई भी काम। और मैंने test-include.php फ़ाइल में एक टेस्ट इको स्टेटमेंट भी जोड़ा और इसे मुद्रित किया जाता है (साथ ही मुझे एक अस्तित्व में शामिल फ़ाइल के बारे में कोई त्रुटि नहीं मिलती है) इसलिए मुझे पता है कि शामिल कथन काम कर रहा है।

+0

क्या आप वाकई काम कर रहे हैं? – Rufinus

+0

यह कैसे विफल हो जाता है? संकलन त्रुटि, निष्पादन त्रुटि, कोई त्रुटि लेकिन गलत परिणाम? – Lucky

+0

यदि आप "आवश्यकता" का उपयोग करते हैं तो आप क्या देखते हैं? यदि आप "echo" डालते हैं तो आप क्या देखते हैं यह test-include.php 'है; " "test-include.php" की शुरुआत में? क्या एक ही निर्देशिका में "test-include.php" है? क्या यह आपके पथ में शामिल है? – GZipp

उत्तर

6

यह परिभाषा आदेश के साथ कुछ करना चाहिए और वास्तव में उनके साथ काम करने से पहले प्रत्येक कक्षा को शामिल किया जाना चाहिए। यदि आप

$main = new mainClass(); 

आपकी स्क्रिप्ट के अंत में यह फ़ाइल शामिल करने के साथ भी ठीक काम करता है क्योंकि सभी कक्षाएं पहले ही परिभाषित हैं। आखिरकार आपको PHP autoload फ़ंक्शन पर एक नज़र रखना चाहिए क्योंकि आप इन समस्याओं को एक छोटे से फ़ंक्शन से छुटकारा पायेंगे।

+1

मुझे लगता है कि प्रश्न का हिस्सा वर्ग परिभाषा आदेश दोनों उदाहरणों में समान है, लेकिन एक काम करता है और दूसरा नहीं करता है। –

+0

हाँ, एलन सही है और मैंने बेस क्लास (टेस्ट 1) को उसी स्थान पर रखने के लिए test2.php (और इसका परीक्षण किया) को संशोधित किया है क्योंकि शामिल कथन test.php में है - test2.php अभी भी इस मामले में काम करता है, इसलिए यह एक ऑर्डर मुद्दा नहीं है जब तक कि PHP में जिस तरीके से मैंने सोचा था, वह काम नहीं करता है (यानी, शामिल फ़ाइल से कोड डाला गया है जिसमें शामिल कथन था)। – Bill

+0

ठीक परिभाषा आदेश इसके लिए बेहतर शब्द है। मैं अभी भी किसी भी प्रसंस्करण शुरू होने से पहले ऑटोलोडिंग या कम से कम सभी कक्षा फ़ाइलों सहित अनुशंसा करता हूं। – Daff

4

ठीक है, मुझे लगता है कि मैंने इसे एक अनुमान लगाया होगा।इस बग रिपोर्ट के अनुसार: 4 अनुमति कक्षाएं

http://bugs.php.net/bug.php?id=30453

पीएचपी के बाद वे PHP 5 के लिए उपयोग किया जाता है लेकिन परिभाषित किया जाना बग धागे पर अंत पोस्टर के शब्दों में,:

PHP5 पिछड़ा संगतता के लिए इसका उपयोग करता है [कक्षाओं का उपयोग करने के बाद] घोषित करता है, लेकिन हम सभी संयोजनों के लिए समर्थन की योजना नहीं बनाते हैं।

तो मुझे लगता है कि यह विशेष मामला उन असमर्थित संयोजनों में से एक है।

0

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

index.php--> 
<?php 
    include_once('parentClass.php'); 
    include_once('childClass.php'); 

    $parentObj = new parent(); 
    $childObj = new child(); 
?> 

child.php--> 
<?php 
    class child extends parent{ 
    function __construct(){ 

    } 
    } 
?> 
संबंधित मुद्दे