Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 115

Область видимости класса

26.09.2013, 09:28. Показов 2171. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример 1
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
var_dump(class_exists("TestClass")); //true
class TestClass {
 
    function __construct() {
        var_dump(__METHOD__);
    }
 
    public function jsonSerialize() {
        return null;
    }
}
 
var_dump(class_exists("TestClass")); //true
пример2:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
var_dump(class_exists("TestClass")); //false
class TestClass implements JsonSerializable {
 
    function __construct() {
        var_dump(__METHOD__);
    }
 
    public function jsonSerialize() {
        return null;
    }
}
 
var_dump(class_exists("TestClass")); //true
почему в одном случае false,в другом true
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2013, 09:28
Ответы с готовыми решениями:

Область видимости переменной
Здравствуйте, довелось мне программировать на языке php. И возникла маленькая неувязочка. У меня есть абстрактный класс и есть...

Область видимости в классах
Почему этот пример выдает именно такой результат? Ведь $this - ссылка на текующий экземпляр класса. class Bar { public function...

Область видимости переменной
Добрый день, подскажите пожалуйста почему переменная не видна. Пробывал так же использовать массив $GLOBAL Каким образом внутри функции...

14
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.09.2013, 09:59
возможно, что из-за этого
5.0.2 Больше не возвращает TRUE для объявленных интерфейсов. Используйте для этого interface_exists().
просто проверяйте после объявления класса, и все..
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 115
26.09.2013, 10:07  [ТС]
Без обид,но такое объяснение не подходит....
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.09.2013, 10:17
Хорошо. Вот вам код функции (https://github.com/php/php-src... unctions.c), разбирайтесь, в чем проблема
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ZEND_FUNCTION(class_exists)
{
    char *class_name, *lc_name;
    zend_class_entry **ce;
    int class_name_len;
    int found;
    zend_bool autoload = 1;
    ALLOCA_FLAG(use_heap)
 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &class_name, &class_name_len, &autoload) == FAILURE) {
        return;
    }
 
    if (!autoload) {
        char *name;
        int len;
 
        lc_name = do_alloca(class_name_len + 1, use_heap);
        zend_str_tolower_copy(lc_name, class_name, class_name_len);
 
        /* Ignore leading "\" */
        name = lc_name;
        len = class_name_len;
        if (lc_name[0] == '\\') {
            name = &lc_name[1];
            len--;
        }
 
        found = zend_hash_find(EG(class_table), name, len+1, (void **) &ce);
        free_alloca(lc_name, use_heap);
        RETURN_BOOL(found == SUCCESS && !(((*ce)->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT)) > ZEND_ACC_EXPLICIT_ABSTRACT_CLASS));
    }
 
    if (zend_lookup_class(class_name, class_name_len, &ce TSRMLS_CC) == SUCCESS) {
        RETURN_BOOL(((*ce)->ce_flags & (ZEND_ACC_INTERFACE | (ZEND_ACC_TRAIT - ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) == 0);
    } else {
        RETURN_FALSE;
    }
}
0
55 / 55 / 8
Регистрация: 29.08.2012
Сообщений: 175
27.09.2013, 23:59
потому что во втором примере первый var_dump() идет до объявления класса. Что касается первого примера, видимо где-то уже класс объявлен.
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 115
28.09.2013, 00:35  [ТС]
Цитата Сообщение от FlyMouse86 Посмотреть сообщение
Что касается первого примера, видимо где-то уже класс объявлен.
Не объявлен.
Я выложил весь код...
0
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
28.09.2013, 21:42
Тоже не понятно. Жду ответа.
0
29.09.2013, 00:08

Не по теме:

да просто еще один баг.. get_declared_classes(), тоже не видит такой класс. Кстати, с интерфейсами все аналогично. Обычные интерфейсы видит, а расширяющие другой интерфейс нет :)

0
 Аватар для nonamez123
189 / 185 / 54
Регистрация: 23.10.2010
Сообщений: 1,336
30.09.2013, 17:47
Зацепил меня этот вопрос... В общем-то с одной стороны логично, ибо на сколько мне известно пыха перед компиляцией кода проходит код один раз на предмет ошибок... Отсюда следует, что ты проверяешь существует ли класс, а он действительно существует в этом файле, но при этом у меня не работает... А не работает из-за того, что этот класс екстендится другим, который подгружается из другого файла ну и на момент первого прохода его там нету. Убрав экстенд файл норм скомпилился.

Подытожив можно сказать, что если класс находится в том же файле, то он ексистс.
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
30.09.2013, 17:53
Цитата Сообщение от nonamez123 Посмотреть сообщение
Подытожив можно сказать, что если класс находится в том же файле, то он ексистс.
неа. Если класс находится в том же файле (возможно, и подключается из другого, не проверял), но до вызова class_exists
0
0 / 0 / 0
Регистрация: 18.06.2013
Сообщений: 115
30.09.2013, 18:09  [ТС]
Цитата Сообщение от nonamez123 Посмотреть сообщение
Зацепил меня этот вопрос... В общем-то с одной стороны логично, ибо на сколько мне известно пыха перед компиляцией кода проходит код один раз на предмет ошибок... Отсюда следует, что ты проверяешь существует ли класс, а он действительно существует в этом файле, но при этом у меня не работает...
Надеюсь это правильное объяснение...
0
 Аватар для nonamez123
189 / 185 / 54
Регистрация: 23.10.2010
Сообщений: 1,336
30.09.2013, 18:17
Цитата Сообщение от KOPOJI Посмотреть сообщение
неа. Если класс находится в том же файле (возможно, и подключается из другого, не проверял), но до вызова class_exists
я по началу тоже так думал, но:

PHP
1
2
3
4
5
6
7
8
<?php
new TestClass;
class TestClass {
    function __construct() {
        var_dump(__METHOD__);
    }
}
?>
выдает string(22) "TestClass::__construct"
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
30.09.2013, 21:29
nonamez123, перечитайте внимательнее первое сообщение. Проблема только при реализации классом интерфейса или при расширении интерфейса другим интерфейсом
PHP
1
2
3
4
5
6
7
8
9
<?php
new TestClass;
interface IFoo {}
class TestClass implements IFoo{
    function __construct() {
        var_dump(__METHOD__);
    }
}
?>
PHP
1
2
3
var_dump(interface_exists('ITest'));
interface IFoo {}
interface ITest extends IFoo{}
0
 Аватар для nonamez123
189 / 185 / 54
Регистрация: 23.10.2010
Сообщений: 1,336
30.09.2013, 21:32
Цитата Сообщение от KOPOJI Посмотреть сообщение
nonamez123, перечитайте внимательнее первое сообщение. Проблема только при реализации классом интерфейса или при расширении интерфейса другим интерфейсом
PHP
1
2
3
4
5
6
7
8
9
<?php
new TestClass;
interface IFoo {}
class TestClass implements IFoo{
    function __construct() {
        var_dump(__METHOD__);
    }
}
?>
PHP
1
2
3
var_dump(interface_exists('ITest'));
interface IFoo {}
interface ITest extends IFoo{}
ога, сорре, не заметил.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
30.09.2013, 21:34
причем это появляется только при расширении интерфейса Наследование классов срабатывает нормально
PHP
1
2
3
var_dump(class_exists('Foo'),class_exists('Bar'));
abstract class Foo {}
abstract class Bar extends Foo{}
и с абстрактными, и с обычными..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2013, 21:34
Помогаю со студенческими работами здесь

Область видимости объектов
Всем здравствуйте! Не нашел в документации по php про область видимости объектов. Подскажите, пожалуйста. function Foo() { ...

Область видимости
Есть страница index.php function send(){ include 'connect.php'; connect(); return $tablename; //ничего нет } ...

Cookie - область видимости
Всем привет! Столкнулся с проблемой видимости &quot;печенек&quot;. Есть файл &quot;1_0.php&quot; там создается переменная и заносится в куки, затем мы...

Область видимости переменных или как правильно спланировать проект
Добрый вечер всем. Подскажите пожалуйста, каким образом распланировать проект так, что бы не пренебрегать ключевым словом global. Я...

Область видимости класса
Есть класс (загрузчик файлов) в отдельном юните: unit LeukocyteDownloader; {$mode objfpc}{$H+} interface uses Classes,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru