Monthly Archives: December 2008
Singleton, static и други подобни PHP щуротии
Какво точно е Singleton и какво са статичните данни? На този въпрос се опитват да си отговорят колегите от BGDev. Тук ще се опитам да хвърля малко светлина по въпроса.
Първо що е то статична данна?
Статични данни са такива, които са “живи” през целият период на изпълнение на приложението. Най-добре ще ме разберете с пример.
function static_test() {
static $a = null;
if( $a == null ) {
$a = 1;
echo ‘Първо извикване на функцията’;
} else {
echo ‘Всяко следващо’;
}
}
static_test();
static_test();
Ха сега, познайте какво ще се покаже при първото и после и при второто извикване?
След като очевидно схванахте как се използват статични данни нека да спомена, че за да може да имате достъп до статични данни в клас ( PHP, Java, а предполагам и други езици ) трябва да дефинирате метода си като статичен. Готиното на статичните методи, е че можете да ги извиквате без да се нуждаете от създаване на обект. Пак пример?
class StaticTest {
private static $test = “test”;
public function getTestNonStatic() {
echo $this->test;
}
public static function getTest() {
echo self::$test . ‘<br />’;
}
}
$StaticTest = new StaticTest();
$StaticTest->getTestNonStatic();
StaticTest::getTest();
Въпросният код дава следният изход:
Notice: Undefined property: StaticTest::$test in …
test
T.e. имате достъп до статични данни само от статични методи.
Сега малко за Singleton. Няма да обеснявам какво е Singleton, а направо ще ви покажа пример за Database клас, който използва такъв шаблон.
class Database {
private static $instance = null;
public static function getInstance() {
if( !self::$instance instanceof self ) {
self::$instance = new self;
}
return self::$instance;
}
private function __construct() {
global $host, $user, $pass, $dbname;
$this->connect( $host, $user, $pass, $dbname );
}
private function connect( $host, $user, $pass, $dbname ) {
$this->host = $host;
$this->user = $user;
echo ‘Host: ‘ . $host . ‘<br />’;
echo ‘User:’ . $user . ‘<br />’;
echo ‘Pass:’ . $pass . ‘<br />’;
echo ‘Name:’ . $dbname . ‘<br /><br />’;
}
public function query( $sql ) {
echo ‘Host: ‘ . $this->host . ‘<br />’;
echo $sql . ‘<br /><br />’;
}
}
$host = $user = $pass = $dbname = “Testing”;
$DBI = Database::getInstance();
$DBI->query( “SELECT .. “);
$DBI2 = Database::getInstance();
$DBI2->query( “INSERT INTO ..” );
Тук ще се наложат малко пояснения явно. ОК. Singleton шаблона е перфектен за извикване на инстанция на клас за връзка с база от данни. Защо? Защото хем е глобален т.е. можем от всяко кътче на PHP кода да си го да извикаме, хем прави само един път връзка към базата … а не 100, ако създавахме обект всеки път. Когато създаваме $DBI обекта, чрез статичният метод getInstance() всъщност се прави проверка дали вече е създаден въпросният обект. Ако не .. тогава правим нов, ако е – връщаме инстанция към него и го използваме. Катко забелязвате ( всъщност може да забележите тук
) Данните за host, user, pass и т.н.т. се показват само един път от connect метода т.е. тук симулирам достъп до базата де .. но виждате резултатът. Та това е “сложният” Singleton шаблон.
Ако имате въпроси използвайте формата за коментари по надолу
Асфалт по релсите на Стамболийски
Ох … щях да умра от смях, четейки новината.
Скъпи, бате Бойко
Спри да наемаш хора с увредени зрителни нерви. Разбирам политиката ти за интегриране на хората в неравностойно положение, но такива хора не трябва да се занимават с ремонта на пътните участъци. Първият път с Цариградско море беше смешно, но при втората издънка вече е плачевно.
Искренно твой,
весел Софиянчо
“Нов дизайн, нови възможности .. след 7 дена”
Много се дразня от сайтове, които правят всичко възможно да се разбере, че “Ще имаме нов дизайн! Нови възможности! Всичко ще е по-добро! Готово е .. изчакайте една седмица и ще видите”. Е, мерси! Визирам data.bg и Metal Katehizis, които правят това в момента. По този повод и аз ще пусна един пъзел, който изразява мнението ми за този начин на презентация.

Скритият рок в коментарите ми
Винаги когато работя слушам музика и понякога групата така ме впечатлява, че оставям по някой и друг коментар из кода ми. Нещо просто като “Edguy rox!” или “Axel Rudi Pell rock da house”. Не е нещо фатално – никога не го слагам в код, който ще го види краен потребител. В повечете ситуации си генерирам случаен стринг от такъв текст.
За какво ви казвам това? Защото днес шефът ми постави задачата да прегледам един стар проект, по който съм работил – MyGetGo. Изпълнявайки стриктно задачата аз попаднах на един мой подобен коментар, а именно “Timeless Miracle rock da house”. Едно бързо търсене в YouTube и веднага се сетих …. велика банда! Изпълняват Pegan Metal
Ето да чуете за какво става на въпрос
Тук трябва да благодаря на Riddermark, който ми ги препоръча на времето.