2015-09-09 3 views
1

=== test.php ===PHP: почему не найден класс

<?php 

var_dump(class_exists('Base')); 
var_dump(class_exists('A')); 
var_dump(class_exists('B')); 

class A extends Base {} 
class B extends Base {} 

class Base 
{ 
    public static function e() 
    { 
     static $number = 0; 
     $number++; 
     var_dump('number is: '.$number); 
    } 
} 

запустить его, результат:

bool(true) 
bool(false) 
bool(false) 

класс А и класс В расширяет базовый класс.

php найдено класс Base.

Почему класс A и класс B не найдены?

Спасибо.

+4

Если вы var_dump после определений, у вас будет все истинное –

ответ

4

Вы определили класс после того, как функции var_dump. Поместите var_dump ниже в класс. то он вернет true.

+0

Почему класс Base может найти? – Jelly

+1

Это происходит из-за свойства «extends» класса A и класса B. Когда вы запускаете этот компилятор кода, сначала проверяйте класс A, но в то время база классов еще не определена, поэтому возвращает значение false. –

+0

Спасибо! Понимаю. – Jelly

1

Это порядок дампов, поместите их ниже кода класса. Рекомендуется сначала поставить базовый класс, Base, а затем объявить другие классы, A и B. И только после того, как они были сделаны, вы можете на самом деле, var_dump их существования.

Так код должен выглядеть примерно так:

<?php 
class Base 
{ 
    public static function e() 
    { 
     static $number = 0; 
     $number++; 
     var_dump('number is: '.$number); 
    } 
} 

class A extends Base {} 
class B extends Base {} 

var_dump(class_exists('Base')); 
var_dump(class_exists('A')); 
var_dump(class_exists('B')); 

Просто испытанной в случае, если это что-то другое, и это возвращает:

bool(true) bool(true) bool(true) 
+2

Большое спасибо. Но я хочу знать, почему класс Base может найти, класс A и класс B не могут найти? – Jelly

+0

@bobo Я честно не уверен, я проверил код в PHP 5.2, 5.3 и 5.4, в 5.2 для вашего дела он вернул мне «true false false», но в 5.4 он вернул мне «true true true», он швы как это связано с версией PHP (может быть, есть и глобальный класс под названием «Base»?), но только в том коде, который я опубликовал выше, он вернул «true true true» во всех трех версиях. – NemanjaT

+1

@bobo Да, только что протестированные швы вроде глобального класса с именем «Base», когда я изменил имя класса с «Base» на что-то несвязанное («Bazaaa' в моем случае), оно вернуло false для него. – NemanjaT

2

Классы в PHP связаны только во время компиляции, когда информация уже доступна.

Так, Base могут быть связаны, как это не имеет зависимостей, но A и B зависит от Base, который еще не связан в то время A и B определены. Поэтому их привязка отложена до времени выполнения. (означает, что класс существует только после того, как строка, в которой они определены, была выполнена).

Попробуйте поместить класс Base перед определениями A и B, и они также будут связаны с компиляцией.

Смежные вопросы