Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/82: Рейтинг темы: голосов - 82, средняя оценка - 4.68
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
1

Способы подключения класса...

11.03.2011, 12:59. Просмотров 15454. Ответов 23
Метки нет (Все метки)

Решил реализовать некоторый web интерфейс к СУБД mySql (скажем список приобретенных товаров). Мой класс - собственно занимается контролем вводимой информации, и формированием нормально форматированного вывода, обработкой ошибок, формированием запросов к БД. Но что бы иметь возможность при формировании SQL запросов использовать такие кошерные вещи как плейсхолдеры и отлов ошибок, скачал библиотеку goDB. Возник вопрос - как правильно подключить ее к своему классу, что бы можно было бы пользоваться ее методами?

Мой класс (примерно). Тут может много ошибок, так как я только начал осваивать ООП
PHP
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
 class Device{
    var $device= array('id','name','type','buyDate','sealPeriod','sealExpDate','owner','outOfOrder','OutOfSeal',invNumber,serialNumber);
    
     //$name;          -Наименование устройства
     //$type;          -Тип устройства
     //$buyDate;       -Дата покупки
     //$sealPeriod;    -Гарвнтийный срок
     //$sealExpDate;   -Срок оканчания гарантии (ваще не знаю нужно ли это свойство т.к. можно вычислить)
     //$owner;         -Владелец (вот тут надо подумать с форматом, так как некоторые хз где)
     //$outOfOrder;    -Списан (boolean)
     //$outOfSeal;     -Истек гарантийный срок
     //$invNumber      -Инвентарный номер
     //$serialNumber   -Серийный номер
    
    
    
    function getDevices($device){
        
        $result = $db("SELECT * FROM 'devices' WHERE 'name'=:name?",$device); 
        $this->Device = $result;
        foreach ($this as $key){
          echo $key;  
        }
        
    }
    
    function setDevice($device){
        
        $this->Device = $device;
    }
}
Класс goDB (конструктор и ничего лишнего)
PHP
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class goDB extends mysqli implements goDBI
{
 
  /*** PUBLIC: ***/
    
    /**
     * Конструктор.
     *
     * Отличия от конструктора mysqli (http://php.net/manual/en/mysqli.connect.php):
     * 1. Исключение при ошибке подключения
     * 2. Дополнительный формат вызова: один аргумент - массив параметров
     * 3. Установка кодировки
     *
     * @link http://pyha.ru/go/godb/connect/
     *
     * @throws goDBExceptionConnect
     *         не подключиться или не выбрать базу
     *
     * @param mixed $host [optional]
     *        хост для подключения (возможен вариант "host:port")
     *        либо массив всех параметров
     * @param string $username [optional]
     *        имя пользователя mysql
     * @param string $passwd [optional]
     *        пароль пользователя mysql
     * @param string $dbname [optional]
     *        имя базы данных
     * @param int $port [optional]
     *        порт для подключения
     *        в случае указания аргументом и в строке $host используется аргумент
     * @param string $socket [optional]
     *        mysql-сокет для подключения
     */
    public function __construct($host = null, $username = null, $passwd = null, $dbname = null, $port = null, $socket = null) {       
        if (is_array($host)) {
            $config = $host;
            $fields = array(
                'host', 'username', 'passwd', 'dbname', 'port', 
                'socket', 'charset', 'debug', 'prefix',
            );
            foreach ($fields as $field) {
                $$field = isset($config[$field]) ? $config[$field] : null;
            }
            $this->setPrefix($prefix);
            $this->setDebug($debug);
        }
        if (!$port) {
            $host = explode(':', $host, 2);
            $port = empty($host[1]) ? null : $host[1];        
            $host = $host[0];       
        }
        @parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
        if (mysqli_connect_errno()) {
            throw new goDBExceptionConnect(mysqli_connect_error(), mysqli_connect_errno());
        }
        if (!empty($charset)) {
            $this->set_charset($charset);
        }
    }
вариант подключения :

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
require('/../lib/godb/godb.php'); 
    
 
    $config = array(
                          'host'     => 'localhost',
                          'username' => 'hunty',
                          'password' => '123',
                          'dbname'   => 'devisedb',
                          'charset'  => 'utf-8',
                          'debug'    => true
      );
 
$db = new goDB($config);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2011, 12:59
Ответы с готовыми решениями:

Подключения класса
Здравствуйте.Есть "заготовка" для плагина.Такая структура: class p_nofollow...

Способы сохранения текста из формы
Есть скрипт, который сохраняет текст из textarea в файлы, форматы которых...

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются...

Как вызвать метод класса в другом методе этого же класса?
<? class load_files{ public function traverse_hierarchy($path) { ...

Как правильно вызвать метод класса внутри самого класса?
Здравствуйте. Собственно тема прописана в заголовке: как правильно вызвать...

23
BreatheInMyVoid
20 / 16 / 0
Регистрация: 05.03.2010
Сообщений: 59
12.03.2011, 10:47 2
Если вам нужно просто использовать класс, то подключите его через include(require), а если вы хотите расширить его функционал своим, то вам нужно свой дочерний класс наследовать от родительского goDB. С.м. наследование в ооп.

PHP
1
2
3
4
require_once 'godb.php'
 
class Device extends goDB {
}
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
22.03.2011, 12:10  [ТС] 3
А если скажем в конструктор закинуть? будет ли это корректно?

Добавлено через 1 час 33 минуты
Вобщем перешел на новую версию goDbю

В итоге все работает процедурно в index.php. Но когда засунул все это в свой класс, метод getAllDevices() не работает по причине того, когда я вызываю его в index.php:

PHP
1
2
3
require ('\classes\parkmanagement.php');
$computer = new Device();
$computer->getAllDevices();
вылетает ошибка: Fatal error: Function name must be a string

Класс целиком вместе с методом:

PHP
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
<?
require ('\..\lib\goDB\autoload.php'); //подключаем библиотеку goDB через ее родной __autoload
 
\go\DB\autoloadRegister();
 
//конфиг подключения:
 
$config = array('host' => 'localhost', 'username' => 'root', 'password' => '',
    'dbname' => 'devisedb', // 'charset'  => 'utf8',
    '_debug' => true, );
 
$db = go\DB\DB::create($config, 'mysql'); //тут может и кроется баг?
 
class Device
{
    public $device = array('id', 'name', 'type', 'buyDate', 'sealPeriod',
        'sealExpDate', 'owner', 'outOfOrder', 'OutOfSeal', 'invNumber', 'serialNumber');
 
    public $db;
 
    public function getAllDevices()
    {
 
        $template = 'SELECT * FROM  devices LIMIT 0 , 30';
 
        return $this->device = $db($template)->row();
 
    }
 
}
0
FunDuck
688 / 379 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
22.03.2011, 14:26 4
Цитата Сообщение от hunty Посмотреть сообщение
public $db;
здесь что лежит?
Цитата Сообщение от hunty Посмотреть сообщение
return $this->device = $db($template)->row();
Тут ты пытаешься вызвать функцию с именем, которое лежит в переменной $db (а в таком случае там должна быть строка, о чем и говорит Fatal Error).
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
23.03.2011, 10:41  [ТС] 5
Стало немного яснее, но я так и не уразумел что тут можно сделать. Как заставить работать этот экземпляр класса в моем классе? Ведь я не смогу явно преобразовать тип.

а
PHP
1
public $db
отчаянная и весьма не продуманная попытка определить область видимости переменной (экземплярa класса), тк как был проблемы с этим.
0
FunDuck
688 / 379 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
23.03.2011, 12:42 6
$db($template)->row();
Эта строка что должна делать?
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
23.03.2011, 13:06  [ТС] 7
В целом вытаскивает строку из базы. Исходя из документации goDB, и тестового запуска вне класса, данная строка - обращение к методу query() с параметром $template. Тут использовал возможность php 5.3 обращение через __invoke , иначе пришлось бы вызывать так:
PHP
1
$db->query($template)->row()
.
row() отвечает за формат возвращаемого значения - Одна строка в виде ассоциативного массива полей.
Подробно про форматы возвращаемых данных этой библиотеки тут: http://code.google.com/p/go-db/wiki/fetch
0
FunDuck
688 / 379 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
23.03.2011, 17:41 8
Значит в $db не объект, который нужен. Что говорит var_dump($this->db) ?
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
24.03.2011, 12:12  [ТС] 9
в классе var_dump выдвавал NULL ибо $db никак не была объявлена внутри класса. После того когда я перенес всю инициализацию godb в __constructor (не знаю на сколько это правильно), и прописал

$this->db = go\DB\DB::create($config, 'mysql');

после этого var_dump вернул следущее:

Javascript
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
object(go\DB\Adapters\mysql)#2 (7) {
  ["connector":protected]=>
  object(go\DB\Helpers\Connector)#3 (5) {
    ["implementation":"go\DB\Helpers\Connector":private]=>
    object(go\DB\Implementations\mysql)#4 (2) {
      ["paramsReq":protected]=>
      array(3) {
        [0]=>
        string(4) "host"
        [1]=>
        string(8) "username"
        [2]=>
        string(8) "password"
      }
      ["paramsDefault":protected]=>
      array(4) {
        ["dbname"]=>
        NULL
        ["charset"]=>
        NULL
        ["port"]=>
        NULL
        ["socket"]=>
        NULL
      }
    }
    ["connection":"go\DB\Helpers\Connector":private]=>
    NULL
    ["params":"go\DB\Helpers\Connector":private]=>
    array(7) {
      ["host"]=>
      string(9) "localhost"
      ["username"]=>
      string(4) "root"
      ["password"]=>
      string(0) ""
      ["dbname"]=>
      string(8) "devisedb"
      ["charset"]=>
      NULL
      ["port"]=>
      NULL
      ["socket"]=>
      NULL
    }
    ["countLinks":"go\DB\Helpers\Connector":private]=>
    int(1)
    ["countConnections":"go\DB\Helpers\Connector":private]=>
    int(0)
  }
  ["paramsSys":protected]=>
  array(4) {
    ["adapter"]=>
    string(5) "mysql"
    ["lazy"]=>
    bool(true)
    ["prefix"]=>
    string(0) ""
    ["debug"]=>
    bool(true)
  }
  ["paramsDB":protected]=>
  array(4) {
    ["host"]=>
    string(9) "localhost"
    ["username"]=>
    string(4) "root"
    ["password"]=>
    string(0) ""
    ["dbname"]=>
    string(8) "devisedb"
  }
  ["prefix":protected]=>
  string(0) ""
  ["debugCallback":protected]=>
  object(go\DB\Helpers\Debuggers\OutHtml)#5 (0) {
  }
  ["connected":protected]=>
  bool(false)
  ["hardClosed":protected]=>
  bool(false)
}
0
FunDuck
688 / 379 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
24.03.2011, 12:50 10
Цитата Сообщение от hunty Посмотреть сообщение
После того когда я перенес всю инициализацию godb в __constructor (не знаю на сколько это правильно), и прописал
$this->db = go\DB\DB::create($config, 'mysql');
Ну вот теперь __invoke должен работать.
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
25.03.2011, 12:34  [ТС] 11
так вот, покурив еще аскетичные маны этой библиотеки, заставил ее работать добавив global $db в конструктор (пока не понял чем это грозит). Получилось так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  function __construct()
    {
        global $db;
        require ('\..\lib\goDB\autoload.php');
 
        \go\DB\autoloadRegister();
 
        $config = array('host' => 'localhost', 'username' => 'root', 'password' => '',
            'dbname' => 'devisedb', // 'charset'  => 'utf8',
            '_debug' => true, );
 
        $this->db = go\DB\DB::create($config, 'mysql');
 
    }
Добавлено через 15 минут
в фунции getAllDevices() реализовал все так:

PHP
1
2
3
4
5
6
7
8
9
10
11
public function getAllDevices()
  {
      
        $pattern = 'SELECT * FROM  devices LIMIT 0 , 30';
 
        $this->device = $this->db->query($pattern, null, 'row'); //обратите внимание, если второй аргумент не нужен, стоит прописать null
 
        foreach ($this->device as $key => $value) {
            echo $key . ' : ' . $value . '<br/>';
        }
  }
Единственное что у меня не получилось сделать - __invoke
Походу что то надо было прописать, но не знаю что и где. Либо как то вызывать все это по другому, ибо при вызове $this->device = $this->db($pattern, null, 'row'); возникет Fatal error: Call to undefined method Device::db() что в принципе очевидно. $this->device = $db($pattern, null, 'row'); вызывает ошибку Fatal error: Function must be a string.
0
DenQ
Комбинатор
978 / 247 / 13
Регистрация: 10.03.2010
Сообщений: 3,556
02.04.2011, 00:58 12
Зачем юзать всякую *****? Уже давно в стандарный комплект пхп идет расширение PDO, которое просто неймоверно удобно, особенно в сочетании с ООП. Это уже стандарт, если хотите.
1
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
06.04.2011, 10:09  [ТС] 13
А русскую документацию с примерами где можно взять? (ясное дело что google, но хотелось бы мнение знающих людей услышать).
0
DenQ
Комбинатор
978 / 247 / 13
Регистрация: 10.03.2010
Сообщений: 3,556
07.04.2011, 08:23 14
Так а за чем? На php.net(надеюсь за рекламу никто не сочтет), все есть и иногда даже на русском. + ко всему там очень много примеров. Мне вот если влом переводить - я просто смотрю примеры и все становится сразу ясно.
0
hunty
62 / 29 / 5
Регистрация: 20.11.2009
Сообщений: 193
07.04.2011, 10:24  [ТС] 15
Согласен. заняло минут 5 что бы разобраться как подключать, и написать первый запрос.
0
DenQ
Комбинатор
978 / 247 / 13
Регистрация: 10.03.2010
Сообщений: 3,556
07.04.2011, 21:54 16
Самое приятное в PDO, так это то что при желании, можно с большой долей легкости перевести весь проект на другую СуБД.
0
AccoRd
4 / 4 / 0
Регистрация: 19.10.2010
Сообщений: 66
05.09.2013, 20:24 17
Не стал создавать новую тему... поэтому ап

пишу
PHP
1
2
$class = 'class_name';
$obj = new $class();
мне пхп ругается, говорит, что класса нет, хотя он есть
файл, в котором класс, подключается инклудом

самое интересное, что на другой машине с xampp все работало нормально. сначала грешил на wamp, установил xampp, та же история. не понимаю что это...
0
Dealiss
293 / 281 / 84
Регистрация: 10.05.2013
Сообщений: 920
05.09.2013, 20:33 18
А зачем вы так усложняете? Почему не на прямую?
PHP
1
$obj = new class_name();
0
AccoRd
4 / 4 / 0
Регистрация: 19.10.2010
Сообщений: 66
05.09.2013, 21:05 19
потому что планируется целая библиотека классов, а не один класс
на сайте пхп даже пример есть
PHP
1
2
3
4
5
6
7
<?php
$instance = new SimpleClass();
 
// Это же можно сделать с помощью переменной:
$className = 'Foo';
$instance = new $className(); // Foo()
?>
значит должно работать
но не работает
не понятно почему
может есть какая-то зависимость от библиотек? никто не сталкивался?
0
Dealiss
293 / 281 / 84
Регистрация: 10.05.2013
Сообщений: 920
05.09.2013, 21:23 20
Используйте __autoload() ...
0
05.09.2013, 21:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 21:23

Способы закодировать строку, с возможностью раскодировать
Здравствуйте. Искал в интернете и не смог найти, если какие-то функции, которые...

Метод абстрактного класса не видит переменные дочернего класса
есть abstract class A{ protected static $dir; public static function f(){} ...

Вызов другого класса при создании свойства класса
Здравствуйте! Пишу внутри класса, но не в методе: public $ln = DB::getLang();...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru