За последние 24 часа нас посетили 67850 программистов и 1650 роботов. Сейчас ищут 883 программиста ...

function __construct() выскажитесь пожалуйста

Тема в разделе "PHP для новичков", создана пользователем AlexProg, 3 мар 2018.

Метки:
  1. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Началось... Еще выскажитесь пожалуйста кто нибудь. Пока есть два мнения :)
     
  2. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Кстати с return $this->title = 'new title'; неважно:
    return self::$_instance;
    или
    return self::$_instance();
    а без return второй вариант при вызове дает ошибку :)
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну извини, чтобы присвоить что-то нестатическому полю, нужно создать экземпляр и вызвать метод у него. Конечно, если ты как статику вызываешь, там никакого $this и близко нету, поскольку экземпляр не создан.
    В JavaScript страшнее. А пыхе как раз таки синтаксис практически плюсовый с небольшими дополнениями, классы весьма предсказуемы. У меня после плюсов неделя ушла на изучение php. Особенно до последнего стандарта, где это уже стало на что-то похоже, но всё равно мозг взрывает.
    А то, что ты предлагаешь, не сработает ни в Java, ни в плюсах, ни в шарпе (хотя последний я поверхностно просматривал)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин, как же ты смог обойтись тут без интерфейса.
    как по мне, так интерфейс тут просится сам собой.
    просто невозможно устоять перед соблзаном.
     
  5. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    По мне так страшнее и багофичнее статические классы без объектов чем объекты без классов :)
    Мне после изучения ооп в JavaScript стало понятнее ооп в пхп :)
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    расскажи, в чем соль
     
  7. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    не знаю, просто там объяснения ооп мне были понятнее, а так пхп мне больше нравится :)
     
  8. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. Class DB extends \PDO{
    2.  
    3.     static $instance = null;
    4.     protected static $options = null;
    5.  
    6.     public function __construct(string $dsn, string $user, string $passwd){
    7.         $this->connect($dsn, $user, $passwd);
    8.     }
    9.  
    10.     public static function instance(\stdClass $arguments): DB{
    11.         if (!isset($arguments->options))
    12.             throw new \Exception("No parameters passed to DB contructor");
    13.  
    14.         self::$options = $arguments->options;
    15.         $obj = new DB(...$arguments->options);
    16.  
    17.         self::$instance = \Core\Container::as_instance($obj, $arguments);
    18.         return self::$instance;
    19.     }
    20.  
    21.  
    22.     public function connect($dsn, string $user = "", string $passwd = ""): void{
    23.         $options = array(
    24.             PDO::ATTR_PERSISTENT => false,
    25.             PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    26.         );
    27.         try {
    28.             parent::__construct($dsn, $user, $passwd, $options);
    29.         } catch (\PDOException $e) {
    30.             throw new \PDOException($e->getMessage(), $e->getCode());
    31.         }
    32.         return;
    33.     }
    34.  
    35.     public function reconnect(): void{
    36.         if (!empty(self::$options))
    37.             $this->connect(...self::$options);
    38.  
    39.         return;
    40.     }
    41. }
     
  9. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    В блоке катч выкидывать исключения? o_O
    Там вообще-то должна обрабатываться ситуация если в трай возникло исключение.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А почему нет? Другое дело, это имеет смысл, если до этого была какая-то обработка, типа логирования, а тут можно просто не ловить, оно само раскрутится
     
  11. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    А так что хуже?
    PHP:
    1. catch (Throwable $e) {
    2.     echo 'Выброшено исключение: ',  $e->getMessage(), $e->getCode(), "\n";
    3. }
    просто смысл наверное поймать и продолжить код
     
    #36 keren, 5 мар 2018
    Последнее редактирование: 5 мар 2018
  12. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Блин! Как же правильно? Как делать?
     
  13. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Тестируй, смотри документацию, там нет такого чтобы в параметре throw new Exception был вызов $e->getMessage(), там может быть текст который потом эта функция получит при возникновении исключения.
     
  14. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Смотри главное не ошибись. Иначе мир разрушиться. Сервер сломается. А сам ты перейдешь на темную сторону какого нибудь nodejs или не дай бог самого ruby
     
    AlexProg нравится это.
  15. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    если планируется использовать несколько типов баз даных (mysqli, sqlite) то второй лучше)) + интерфейс))
    а если это проект который будет работать только на к примеру mysqli тогда и первый вариант зашибись))