За последние 24 часа нас посетили 22258 программистов и 1056 роботов. Сейчас ищут 680 программистов ...

namespace и include

Тема в разделе "PHP для новичков", создана пользователем shtrih, 24 сен 2019.

  1. shtrih

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

    С нами с:
    10 дек 2015
    Сообщения:
    59
    Симпатии:
    3
    Вечер добрый!

    Использую библиотеку Longman для телеграмм бота . Есть файл GenericmessageCommand, который отвечает за ответ бота, на сообщение пользователя.

    В этом файле мне требуется обратиться к своей базе данных и плюс к своему классу.

    Как правильно это сделать?

    Если я пишу в этом коде include (path/bd.php);, то программа меняет пути из-за namespace.

    Заранее спасибо.

    .\adm\basemysqli.php


    .\adm\Commands\GenericmessageCommand.php


    PHP:
    1. <?php
    2. /**
    3. * This file is part of the TelegramBot package.
    4. *
    5. * (c) Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
    6. *
    7. * For the full copyright and license information, please view the LICENSE
    8. * file that was distributed with this source code.
    9. */
    10.  
    11.  
    12.  
    13. namespace Longman\TelegramBot\Commands\SystemCommands;
    14.  
    15. use Longman\TelegramBot\Commands\SystemCommand;
    16. use Longman\TelegramBot\Conversation;
    17. use Longman\TelegramBot\Request;
    18.  
    19.  
    20.  
    21.  
    22. /**
    23. * Generic message command
    24. *
    25. * Gets executed when any type of message is sent.
    26. */
    27. class GenericmessageCommand extends SystemCommand
    28. {
    29.  
    30.     /**
    31.      * @var string
    32.      */
    33.     protected $name = 'genericmessage';
    34.  
    35.     /**
    36.      * @var string
    37.      */
    38.     protected $description = 'Handle generic message';
    39.  
    40.     /**
    41.      * @var string
    42.      */
    43.     protected $version = '1.1.0';
    44.  
    45.     /**
    46.      * @var bool
    47.      */
    48.     protected $need_mysql = true;
    49.  
    50.     /**
    51.      * Command execute method if MySQL is required but not available
    52.      *
    53.      * @return \Longman\TelegramBot\Entities\ServerResponse
    54.      * @throws \Longman\TelegramBot\Exception\TelegramException
    55.      */
    56.     public function executeNoDb()
    57.     {
    58.    
    59.  
    60.     }
    61.  
    62.     /**
    63.      * Command execute method
    64.      *
    65.      * @return \Longman\TelegramBot\Entities\ServerResponse
    66.      * @throws \Longman\TelegramBot\Exception\TelegramException
    67.      */
    68.     public function execute()
    69.     {
    70.         //If a conversation is busy, execute the conversation command after handling the message
    71.         $conversation = new Conversation(
    72.             $this->getMessage()->getFrom()->getId(),
    73.             $this->getMessage()->getChat()->getId()
    74.         );
    75.         $message = $this->getMessage();
    76. // Здесь требуется доступ к mysqli базе
    77.     }
    78. }
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    звучит как-то странно. ты можешь указать полное имя класса вместе с неймспейсом. типа
    PHP:
    1. $db = new \Foo\Bar\DB;  // здесь явное указание корневого неймспейса
    или предварительно упомянуть класс во фразе use, там все именя танцуют от корневого неймспейса. а затем в коде уже без неймспейса, PHP помнит путь из use.
    PHP:
    1. use Foo\Bar\DB;
    2. // ...
    3. $db = new DB;
     
    Roman __construct нравится это.
  3. shtrih

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

    С нами с:
    10 дек 2015
    Сообщения:
    59
    Симпатии:
    3
    db это не класс, db это файл с настройками для подключения к mysql.

    А второй класс, который я хочу подключить,он не связан ни как c неймспейсом

    Файл db.php
    PHP:
    1. <?php
    2.     session_start();
    3.  
    4.        $mysqli = new mysqli("localhost", "s*******", "******", "**************");
    5.     /* Проверяем соединение */
    6.     if ($mysqli->connect_errno) {
    7.         //printf("Ошибка соединения: %s\n", mysqli_connect_error());
    8.         exit();
    9.     }
    10.     $mysqli->query("set names UTF8");
    11.     $mysqli->query("SET session wait_timeout = 28800");
    12.     $mysqli->query("SET session max_allowed_packet = 1073741824");
    13.    
    14.     if ($result = $mysqli->query("SELECT DATABASE()")) {
    15.         $row = $result->fetch_row();
    16.         $db= $row[0];  //Текущая база
    17.         $result->close();
    18.     }
    19.  
    20. ?>
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Окей. Тогда ответ такой: НЕЙМСПЕЙС НИКАК НЕ ВЛИЯЕТ НА ПУТЬ ОТКУДА ПОДКЛЮЧАЮТСЯ ФАЙЛЫ.

    Есть настройка include_path, она не зависит от неймспейса.

    Ты сам попутал автолоадер классов и просто include и нас ввёл в заблуждение.
    --- Добавлено ---
    Имеет значение как ты указал путь до файла в include: начинается ли он с "." или "/", например.
    Ты можешь использовать константу __DIR__ чтобы с уверенностью указать нужный адрес.
     
    miketomlin нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.790
    Симпатии:
    649
    Что это? Возьмите за правило так писать только при использовании include_path.
     
  6. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    у меня такое ощущение что TC пытается в файлы библиотеки внести свои изменения..