Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> ООП и "магические" методы., Хелпните ламеру)
bobo  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Местный житель
****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 192
Пользователь №: 22907
На форуме: 6 лет, 6 месяцев, 18 дней
Карма: 1




Доброе утро, есть несколько вопросов к вам)

Играюсь с ООП.
Класс соединения с БД:


class Connect {

public function dbConnect() {

@$mysqli = new MySQLi(DB_LOCATION,DB_USER,DB_PASS,DB_NAME);

if (mysqli_connect_errno()) {

echo "Ошибка при соединении с Базой Данных: ".mysqli_connect_error();
exit;

}

$mysqli -> query("SET NAMES cp1251");
$mysqli -> query("SET CHARACTER SET cp1251");
$mysqli -> query("SET COLLATION_CONNECTION='cp1251_general_ci'");

echo "connect<br>";

return $mysqli;

}

public function dbClose() {

echo "close<br>";

self::dbConnect() -> close();

return TRUE;

}

}





Мой класс:


class Test {




public function __construct() {

$this -> db = Connect::dbConnect();

}



public function test() {

$queryObjId = $this -> db -> query("QUERY");
$array = $queryObjId -> fetch_assoc();

return $array['id'];

}



public function __destruct() {

Connect::dbClose();

}



}



1. Как передать идентификатор коннекта обычной переменной, что то вроде


public function __construct() {

$this -> db = Connect::dbConnect();
$this -> db = $db;

}


что б в дальнейшем можно было писать $query = $db -> query(" ... ");

2. При выполнении, т.е.


$test = new Test;
echo $test -> test();


браузер выдает

Цитата

connect
3 close
connect


Почему после закрытия соединения он опять его открывает то ??
Заранее благодарю!



Спустя 14 минут, 49 секунд (8.12.2011 - 07:44) minor написал(а):
self::dbConnect() -> close();

Connect::dbConnect();

Первое что бросилось в глаза, обрашаетесь к обьекту через контекст класса.
Лучше просто посмотрите и разберитесь с реализацию singleton`a с ним обычно пишут примеры подключения к бд.

Спустя 8 минут, 36 секунд (8.12.2011 - 07:53) linker написал(а):
1.
public function __call($name, $args)
{
if (method_exists($this->db, $name))
call_user_func_array(array($this->db, $name), $agrs);
}
...
$test = new Test();
$test->query('SELECT 1');

2. Ну ты же сам написал self::dbConnect() -> close();потому и открывает.

Про наследование почитай.

Спустя 25 минут, 27 секунд (8.12.2011 - 08:18) bobo написал(а):
Спасибо.
Со вторым вопросом все ясно, спасибо)


public function dbClose($link) {

echo "close<br>";

$link -> close();

return TRUE;

}



public function __destruct() {

Connect::dbClose($this -> db);

}



Все вроде ок, открыл соединение, выполнил что надо, закрыл соединение.


С первым вопросом нечего не понял если честно, говорю ж - я ламер еще :(

Спустя 7 минут, 54 секунды (8.12.2011 - 08:26) linker написал(а):
Про магические методы почитай.

Спустя 27 минут, 17 секунд (8.12.2011 - 08:53) bobo написал(а):
Почитал, с этим как раз все понятно)

Не могу понять логики конструкции

if (method_exists($this->db, $name))
call_user_func_array(array($this->db, $name), $agrs);

Дальше то с функцией test(); это как увязать ?

Спустя 6 минут, 3 секунды (8.12.2011 - 08:59) Michael написал(а):

 ! 

М
Давайте своим темам вменяемое название
Michael

Спустя 5 минут, 59 секунд (8.12.2011 - 09:05) bobo написал(а):
done)

Спустя 2 часа, 4 минуты, 59 секунд (8.12.2011 - 11:10) caballero написал(а):
Цитата
Не могу понять логики конструкции


Проблема не в логике конструкции ( это просто вызов метода по его имени и массиву параметров) проблема в логике ее присутствия здесь в теме вопроса вообще.


По теме - используй синглетон.

вот выдрал пример со своего сайта
использую библиотеку ADODB но сути дела не меняет

<?php


require_once _ROOT . 'lib/adodb5/adodb.inc.php';



class DB
{

private $conn = null;
private static $db = null;

public static function getDB()
{
if (self::$db == null)
{
self::$db = new DB();
}
return self::$db;
}

public static function getConnect()
{
$db = DB::getDB();
$db->open();
return $db->conn;
}



private function open()
{
global $config;
if ($this->conn instanceof ADOConnection)
{
return;
}
$this->conn = ADONewConnection('mysqli');
$this->conn->Connect($config["db"]["dbhost"], $config["db"]["dbuser"], $config["db"]["dbpass"], $config["db"]["dbname"]);
$this->conn->Execute("SET NAMES 'utf8'");
}

}



// получаем коннект в любом месте

$conn = DB::getConnect();



?>






Спустя 7 часов, 48 минут, 9 секунд (8.12.2011 - 18:58) bobo написал(а):
Спасибо, растолковали)

Спустя 4 часа, 46 минут, 53 секунды (8.12.2011 - 23:45) Guest написал(а):
global $config
да еще в классе?
да еще с полной уверенностью, что только connection с одной базой достаточно?
не очень хороший пример.

Спустя 3 минуты, 26 секунд (8.12.2011 - 23:49) SlavaFr написал(а):
Цитата (Guest @ 8.12.2011 - 20:45)
global $config
да еще в классе?
да еще с полной уверенностью, что только connection с одной базой достаточно?
не очень хороший пример.


забыл зарегистрироваться, это мое сообщение


Спустя 12 минут, 26 секунд (9.12.2011 - 00:01) caballero написал(а):
Цитата
global $config
да еще в классе?


и что?


Цитата
да еще с полной уверенностью, что только connection с одной базой достаточно?

Достаточно или не достаточно для чего?

Человек просил пример синглетона, что еще надо.

Спустя 27 минут, 41 секунда (9.12.2011 - 00:29) SlavaFr написал(а):
Цитата (caballero @ 8.12.2011 - 21:01)
Цитата
global $config
да еще в классе?


и что?


Цитата
да еще с полной уверенностью, что только connection с одной базой достаточно?

Достаточно или не достаточно для чего?

Человек просил пример синглетона, что еще надо.

1) где человек просил singelton?
2) если хочеш действительно, чтоб я о global в классе или в функциях рассказал, то давай это делать в форуме для начинающих.

Спустя 4 минуты, 29 секунд (9.12.2011 - 00:33) caballero написал(а):
Цитата
1) где человек просил singelton?


Человек хотел класс для конекта с БД ему порекомендовали singleton что вполне логично

Цитата
2) если хочеш действительно, чтоб я о global в классе или в функциях рассказал, то давай это делать в форуме для начинающих.

Мне не надо ничего рассказывать. я программировать начал еще когда ты под стол пешком ходил.

Ничего не можешь сказать по существу есть раздел на форуме специальный так и называется - флейм.

Спустя 7 часов, 18 минут, 47 секунд (9.12.2011 - 07:52) linker написал(а):
global в классе - это реально жопа. Если уж ты так давно кодишь, то почему не написал так
private function open($config)
{
if ($this->conn instanceof ADOConnection)
{
return;
}
мало ли у меня серверов, мало ли у меня будет конфигов. Самое поганое, что ты привязываешь не только к конкретной переменной, но и к конкретному названию переменной - говногод.

Спустя 2 часа, 37 минут, 16 секунд (9.12.2011 - 10:29) SlavaFr написал(а):
@caballero Ладно, я могу себе еще представить, что какойто продукт только с одной Базой и только с одним db_user работает и по этому ограничевает себя на одну конекцию.
Но если мы хотим здесь показывать примеры, то должны немного за качеством кода следить, так как этими примерами потом будут пользоватся.

Если я не вдаваясь в подробности напишу такой логически правилный код вне функций и классов:

$config = '/home/caballero/http/config.ini';
$conn = DB::getConnect();

то он не будет работать только по пречине того, что Bы преминили глобальную переменную и мне прийдется вместо того чтоб класс использовать его переделывать.

в общем @linker описал уже проблему.


Цитата (caballero @ 8.12.2011 - 21:33)
Мне не надо ничего рассказывать. я программировать начал еще когда ты под стол пешком ходил.


1)По чему Вам не чего не надо раскатывать? Нет интереса узнавать новое?

2) На основании какой Информации Вы утверждаете, что старше меня, да еще и на столько, что программировали когда я был маленьким?

Спустя 47 минут, 40 секунд (9.12.2011 - 11:17) caballero написал(а):
Цитата
Если уж ты так давно кодишь, то почему не написал так

Во первых никакой жопы там нет, особенно если учесть что это единственный глобал на ввесь проект. А во вторых откуда я возьму параметр для приватного open? Можно конечно написать метод в синглетоне котрый присвоит конфиг внутренней переменной. А на фига городить лишний код.
Я прекрасно понимаю что использование глобов не есть хорошо. Но городить какой то костыль изза одной перменой смысла нет. Кстати константы по определению глобальные. Ну сделал бы я эти параметры через const. Или сессию например которая тоже глобальная. И чем бы это отличалось кроме того что не задело бы чуства grammar nazy.
Испльзование голобальных переменных влияет на читабельность и надежность кода (и никак на безопасность) но в случае с одной переменной эти проблеммы отсутствуют.

Цитата
мало ли у меня серверов, мало ли у меня будет конфигов

В данном случае у меня один сервер и один конфиг. Есть такая шняга именуется бритва Оккама - не надо плодить сущностей сверх необходимого. Иначе фреймворки вырастают до мегабайтных сорцов.

Цитата
@caballero Ладно, я могу себе еще представить, что какойто продукт только с одной Базой и только с одним db_user работает и по этому ограничевает себя на одну конекцию.

Во первых никто ничего не ограничивает - можно сунуть стопицот конектов в один синглетон, во вторых подавляющее число проектов использует одну БД. Остальные используют две и больше изза криворуких архитекторов. Только единичные проекты уровня предприятий или раскрученых порталов используют больше одной БД по уму. И то если БД не разнородные (типа реляционная и nosql) используется кластер что с точки зрения разработчика - один коннект.
PHP это не J2EE server где есть распределенные транзакции и можно десяток баз не рискуя потерей консистентности данных.

Цитата
$config = '/home/caballero/http/config.ini';

С какого перепугу ты решил что у меня там ini файл а не обычный php файл с массивом? Остальные твои "аргументы" надо полагать тоже плод воспаленного воображения.


Цитата
По чему Вам не чего не надо раскатывать? Нет интереса узнавать новое?

Есть, но от тебя я ничего не узнаю. От linker могу узнать хоть он и в обиде за то что я на его Путина наехал.

Цитата
На основании какой Информации Вы утверждаете, что старше меня, да еще и на столько, что программировали когда я был маленьким?

На основании твоих убогих постов (см.выше).


Спустя 22 минуты, 21 секунда (9.12.2011 - 11:39) SlavaFr написал(а):
Цитата (caballero @ 9.12.2011 - 08:17)
Цитата
$config = '/home/caballero/http/config.ini';
-------------
С какого перепугу ты решил что у меня там ini файл а не обычный php файл с массивом? Остальные твои "аргументы" надо полагать тоже плод воспаленного воображения.



я не чего не решал, я просто программировал и зарегистрировал переменную которую ты зделал в твоей приватной методе глобальной.

Цитата (caballero @ 9.12.2011 - 08:17)
но от тебя я ничего не узнаю. От linker могу узнать хоть он и в обиде за то что я на его Путина наехал.

-----------
Я думаю что @linker делал свои посты относительно php не вдаваясь в подробности вашей религии и политических убеждений. А то, что Вы от меня не чего не узнали, то это возможно моя вина.


Цитата (caballero @ 9.12.2011 - 08:17)
Цитата
На основании какой Информации Вы утверждаете, что старше меня, да еще и на столько, что программировали когда я был маленьким?
-----------------
На основании твоих убогих постов (см.выше).


что именно убого? Я попробую другими словами обяснить, я ведь понимаю, что вы пенсионного или предпенсионного возраста, так как я в 60х под стол пешком ходил, а вы в это время прграммировали.

Спустя 3 часа, 22 минуты, 52 секунды (9.12.2011 - 15:02) caballero написал(а):
Цитата
что именно убого?

Проще перечислить что не убого. Просто напиши хоть что нибудь по существу. Не просто - это фигня, с аргументами почему. Возможно я и соглашусь. Но как технарь - желаю видеть техническую аргументацию.

Цитата
А то, что Вы от меня не чего не узнали, то это возможно моя вина

Ну если полезной инфы 0 бит то узнать что либо действительно проблематично.

Цитата
Я попробую другими словами обяснить, я ведь понимаю, что вы пенсионного или предпенсионного возраста, так как я в 60х под стол пешком ходил, а вы в это время прграммировали.

ладно, проехали. Допустим вы немного старше. Так зачем начинать изучать программирование? Внукам в проектах помогать?



Спустя 2 дня, 23 часа, 6 минут, 58 секунд (12.12.2011 - 14:09) SlavaFr написал(а):
Цитата (caballero @ 9.12.2011 - 12:02)
Но как технарь - желаю видеть техническую аргументацию.

да я ведь уже живой пример привел, что может сручится если ктото зарегистрирует и инициализирует переменную со случайным именем $config вне функций и классов перед первым вызовом DB::getConnect();

На определленном моменте в "software development" нет технической аргументации, а есть технические рекомендации которые люди на опыте собственных ошибок собирали.

1) Если учесть, что в php 5.3 специально придумывали Namespace для избежания конфликта с названиями классов из огромног количества библиотек, то примене глобальных переменных остоваясь возможным технически, стало обсалютно не возможно логически.
По том, что возможен конфликт с именами переменных.

2) Если я программиерую Класс для "Библиотеки" то не желательно его делать зависящим от переменных и обектов которые в нем не зарегистрированы и не посажены set-Методами.
Почему? По тому, что его потом почти не возможно тестировать в PHPUnit и нет возможности заменить посаженые объекы на Mocк-обекты.
Как с этим боротся? : Создовать новые классы, которые перенимают на себя инициализацию сложных объектов. Эти классы для инициалисации, не являются частью "Библиотеки", а частью "Framework".

3) Singelton: применяется только в тех случаях, когда 100% требуется только одна инстанция объекта.
Например я, и нетолько я, не согласны с тем что в "библиотеке" должена сущиствовать только одна конекция и я не согласен с тем, что класс DB может работать только с одной конекцией.

В конечной программе, я допускаю то, что существует только одна конекция, но по причине того, что конечная программа пользуется "framework" или "библиотекой" то я не допускаю не в одном из этих случаев того, что класс с названием "DB" разрешает работу только с одним коннектом.

Если ты не используеш уже горовую библиотеку, и не сомотря на немыслемое количество прекрассных боблиотек решился по причине (Х) написать чтото свое, то делай классы по возмозности независимыми друг от друга, а если этого не избежать, то бросайте просто Exception в случае если какойто компонент отсутствует.



Спустя 1 час, 6 минут, 31 секунда (12.12.2011 - 15:16) caballero написал(а):
Цитата
что может сручится если ктото зарегистрирует и инициализирует переменную со случайным именем $config вне функций и классов перед первым вызовом DB::getConnect();

кто зарегистрирует? Барабашка? Лично я помню где у меня конфиг. Да и архитектура не предусматривает сования переменных где попало только если не сделать это специально. В частности первый коннект выполняется в файле инициализации куда нечего лазить с переменными. А если человек совсем криворукий то он может переопределить переменную и перед присвоением свойства синглетону через set
Впрочем не случится ничего страшного - сразу проявится ошибка конекта. Это не относится к трудноуловимым ошибкам изза которых не рекомендуются глобалы.

Цитата
По тому, что его потом почти не возможно тестировать в PHPUnit и нет возможности заменить посаженые объекы на Mocк-обекты.

Я не юзаю моки, я тестирую непосредственно с объектами - это заложено в архитектуре.

Цитата
Например я, и нетолько я, не согласны с тем что в "библиотеке" должена сущиствовать только одна конекция и я не согласен с тем, что класс DB может работать только с одной конекцией.


Конекций можно в синглетон сунуть сколько угодно. Сделать для каждой свой метод получения соединения с БД и все дела.
Но вряд ли есть смысл усложнять архитектуру (например указывать активрекорду откуда ему грузится) изза маловероятной возможности работать с двумя базами.

Цитата
то делай классы по возмозности независимыми друг от друга, .

Это непонятно к чему но я и так делаю классы независимыми - зачем их делать зависимыми?

Цитата
а если этого не избежать, то бросайте просто Exception в случае если какойто компонент отсутствует

Когда копипастишь учебник хотя бы читай что копипастишь
а то уже непонятно куда пошли.


Хотя с конфигом отчасти согласен но пока это самый простой способ подключения, никакого желания парсить какой нибудь XML с диска пока не имею.










Спустя 54 минуты, 30 секунд (12.12.2011 - 16:10) Michael написал(а):
caballero, критиковать всех ой как любишь, а как тебя по делу подловили, так не понравилось, да? wink.gif

Цитата (caballero)
На основании твоих убогих постов (см.выше).


 ! 

М
корректней с другими пользователями общайся, тебе не хамили.
Michael


Спустя 29 минут, 11 секунд (12.12.2011 - 16:39) SlavaFr написал(а):
Цитата (caballero @ 12.12.2011 - 12:16)
то зарегистрирует? Барабашка?

1) я написал для тех, кто "software" пишет. Тоесть когда пишут классы чтоб ими в будущем пользоватся и чтоб не страшно было группе программистов с этим работать.
Цитата (caballero @ 12.12.2011 - 12:16)
Я не юзаю моки, я тестирую непосредственно с объектами

смотри выше (1)

Цитата (caballero @ 12.12.2011 - 12:16)
Конекций можно в синглетон сунуть сколько угодно. Сделать для каждой свой метод получения соединения с БД и все дела.

а патарны для того придумали, чтоб другие програмисты их сразу увидеть могли. т.е опять смотри выше (1)

Цитата (caballero @ 12.12.2011 - 12:16)
Это непонятно к чему но я и так делаю классы независимыми - зачем их делать зависимыми?
ок, ты не делаеш классы зависемыми от других, ты их делаеш зависемыми от глобальных переменных.

Цитата (caballero @ 12.12.2011 - 12:16)
Когда копипастишь учебник хотя бы читай что копипастишь

все что я в этом топике написал, небыло скопировано.

в общем я охотно дискутирую с людьми, которые в состоянии воспринимать чужое мнение и сам у таких с удовольствием учусь. Для меня этот топик до тех пор закрыт, пока не появятся конструктувные вопросы или мнения.









Спустя 33 минуты, 45 секунд (12.12.2011 - 17:13) caballero написал(а):
Цитата
критиковать всех ой как любишь, а как тебя по делу подловили, так не понравилось, да

нету никакого дела. придрались не по существу а по теории прочитаной в учебнике. Считайте что переименовал переменную в

$__config__

Какова вероятность что ее кто то перебьет переменнной с таким же именем да еще и не обнаружит что у него сайт к базе перестал коннектится.


Цитата
а патарны для того придумали, чтоб другие програмисты их сразу увидеть могли

Как несколько конектов или какое либо иное содержимое противоречит паттерну синглетон?

Цитата
ок, ты не делаеш классы зависемыми от других

Отож, внимательнее копипасть

Цитата
ты их делаеш зависемыми от глобальных переменных.

а если я сделаю его зависимым от конфига в xml файле на диске или типа того - ему от этого легче?

Цитата
все что я в этом топике написал, небыло скопировано.

Согласен - это был рерайт, но книжный стиль видно за километр.

Цитата
в общем я охотно дискутирую с людьми, которые в состоянии воспринимать чужое мнение


Хорошо, приходи когда у тебя будет свое мнение а не чужое.



PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса