Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2014, 21:16   #1
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
Вопрос Проблема с исключениями

Привет всем. Играя с наследованием исключений наткнулся на такую проблему: Если класс(dbExceptions) "помещен" в пространство имен (App\Exceptions) и наследует методы и свойства базового класса exceptions, функция автозагрузки класса пытается загрузить "лишний класс". Подгружая классы функция выдает вот такое:
Код:
classes/App/Exceptions/dbException.php // все норм
classes/App/Exceptions/Exception.php    // пытается загрузить вот это чудо
Выкладываю весь код для наглядности
Файл index.php
PHP код:
use App\Exceptions\dbException as dbException;
function 
__autoload($class){
    
$class 'classses/'.str_replace('\\','/',$class).'.php';
    echo 
$class,"<hr>";
    require_once(
$class);
}
class 
test{
    public 
$server;
    public 
$user;
    public 
$password;
    function 
__construct(){
    echo 
"test created";
    }
    function 
connect($server,$user,$password){
    
$this->server $server;
    
$this->user $user;
    
$this->password $password;
    try{
        if(!
mysql_connect($this->server,$this->user,$this->password)){
        throw new 
dbException();}
        }
    catch (
dbException $e){
        echo 
$e;}
    }
}
$class = new test();
$class->connect('blablabla','blabla','blablabla'); 
Файл dbException.php
PHP код:
namespace App\Exceptions;

class 
dbException extends Exception
{
    public function 
__construct(){
    echo 
'dbException created';
    
$this->message 'catched exception';
    }
    
    public function 
__toString(){
    return  
"<hr>".$this->getCode()." : ".$this->getMessage()." <br> ".$this->getFile()." ".$this->getLine()."<hr>";
    }

Lucky beggar вне форума Ответить с цитированием
Старый 24.06.2014, 21:58   #2
vasiatka
Пользователь
 
Аватар для vasiatka
 
Регистрация: 18.02.2014
Сообщений: 90
По умолчанию

Я с пространствами имен дело не имел пока, но как мне кажется твой класс пытается отнаследоваться от класса \App\Exceptions\Exception, который у тебя не описан.
Может попробовать наследоваться как-то так:
Код:
class dbException extends \Exception
Не уверен в правильности синтаксиса.
В бинарной системе счет ведут не по пальцам, а по кулакам.
Пенза - мой город - я из Пензы.
vasiatka вне форума Ответить с цитированием
Старый 24.06.2014, 22:23   #3
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Да, именно так! Все создаваемые классы ищутся в контексте текущего пространства имен. Нужно либо дописать:
Код:
use \Exception;
Либо делать как написал vasiatka.

PS: для автозагрузки классов лучше использовать spl_autoload_register

Цитата:
spl_autoload_register() позволяет задать несколько реализаций метода автозагрузки описаний классов и интерфейсов. Она создает очередь из функций автозагрузки в порядке их определения в скрипте, тогда как встроенная функция __autoload() может иметь только одну реализацию.
PSS: mysql_connect, такой способ работы с базой данных уже давно устарел и не безопасен, нужно убить кучу времени чтобы закрыть дыры. Рекомендую сразу использовать PDO. Тут есть простой готовый PdoAdapter;

Последний раз редактировалось Kostia; 24.06.2014 в 22:34.
Kostia вне форума Ответить с цитированием
Старый 24.06.2014, 23:20   #4
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Большое спасибо , vasiatka. Ваш пример кода исправил мою ошибку . Блин, а я то думал, что базовые классы доступны везде . Вот так сюрприз )))
Lucky beggar вне форума Ответить с цитированием
Старый 24.06.2014, 23:44   #5
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Спасибо большое , Kostia . Взял на заметку Ваш способ .
PS: Спасибо за замечание. SPL функции были следующей "жертвой" (после исключений)
PPS: Спасибо за инфу и за ссылку. Честно не знал, что такое PDO до этого.
Lucky beggar вне форума Ответить с цитированием
Старый 25.06.2014, 12:59   #6
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Цитата:
Сообщение от Lucky beggar Посмотреть сообщение
Спасибо большое , Kostia . Взял на заметку Ваш способ .
PS: Спасибо за замечание. SPL функции были следующей "жертвой" (после исключений)
PPS: Спасибо за инфу и за ссылку. Честно не знал, что такое PDO до этого.
В версии php 5.6 mysql_ deprecated
Уже давно все используют PDO или mysqli
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 25.06.2014, 17:31   #7
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Цитата:
Сообщение от TranceSmile Посмотреть сообщение
В версии php 5.6 mysql_ deprecated
Уже давно все используют PDO или mysqli
Изучаю все один. Наверное поэтому владею немного "устаревшими" знаниями. О mysqli читал давно, но не придал этому большого значения (лень было изучать на тот момент )
Lucky beggar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложная замена значений в ячейке с исключениями uranium238 Microsoft Office Excel 2 12.04.2013 18:00
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Решение систем линейных алгебраических уравнений методом обратной матрицы (желательно обычными жордановыми исключениями, на Delphi Tores007 Помощь студентам 1 09.02.2012 10:33
Странности с исключениями РагнаР Общие вопросы C/C++ 2 08.03.2011 22:56
Разобраться с исключениями... Utkin Общие вопросы по программированию, компьютерный форум 5 10.02.2009 17:08