Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: batman, dodany: 01.02.2011 08:00, tagi: php

Pamiętacie jeszcze w jaki sposób kolorowana była składnia PHP w jednym z ostatnich wydań Eclipse? Przede wszystkim była przejrzysta. Wraz z pojawieniem się ostatniej wersji tego narzędzia, kolory uległy radykalnemu pogorszeniu, co spowodowało, że kod stał się nieczytelny. Jedyne co można było zrobić to samemu mozolnie zmieniać kolor każdego elementu. Na szczęście ktoś wpadł na genialny pomysł i stworzył galerię kolorów. Mowa oczywiście o tytułowym serwisie Eclipse Color Themes, oferującym kilkadziesiąt gotowych schematów kolorów, które możemy pobrać i kilkoma kliknięciami zainstalować. Oprócz przygotowanych schematów mamy również możliwość pobrać wtyczkę do Eclipse’a, która w bardzo prosty sposób pozwala zmieniać aktualny układ kolorów. Niestety nie jest ona dopracowana i lubi zgłosić wyjątek podczas zmiany schematu.

Jak proste jest korzystanie z gotowych schematów kolorów, możecie obejrzeć na krótkim filmie instruktarzowym.

How to import Eclipse Preferences (*.epf) from Roger Dudler on Vimeo.

Autor wpisu: Wojciech Sznapka, dodany: 31.01.2011 12:15, tagi: php, symfony

Na firmowym blogu http://xlab.pl zamieściłem post odnośnie mojej ostatniej prezentacji na temat Symfony2 – zapraszam do lektury :-) Post jest dostępny pod tym linkiem.

Autor wpisu: batman, dodany: 31.01.2011 08:00, tagi: php

Jedną z najbardziej wyczekiwanych funkcjonalności po wprowadzeniu do PHP obiektowości z prawdziwego zdarzenia, były przestrzenie nazw. Jeszcze przed swoim pojawieniem się budziły kontrowersje za sprawą separatora. Nie dość, że mamy do dyspozycji strzałkę (dla obiektów, ich metod oraz właściwości), podwójny dwukropek (dla statycznych metod i właściwości), to dostaliśmy kolejny symbol – backslash, oddzielający od siebie kolejne przestrzenie nazw. Niezależnie od tego, czy symbol ten się nam podoba, czy też nie, warto wiedzieć co to są przestrzenie nazw i jak z nich korzystać.

Co to są przestrzenie nazw i po co powstały?

Odpowiedź na powyższe pytanie najlepiej będzie przedstawić na przykładzie. Załóżmy, że tworzymy duży projekt, w skład którego będzie wchodzić kilka aplikacji, między innymi blog oraz forum. Tak się składa, że obie aplikacje posiadają klasę o takiej samej nazwie – Entry, będącą obiektową reprezentacją pojedynczego posta/wpisu. Jeśli stworzymy widok prezentujący wpisy na blogu oraz posty na forum pojedynczego użytkownika, staniemy przez problemem doskonale opisanym w poniższym błędzie.

Fatal error: Cannot redeclare class Entry

W tym właśnie celu powstały przestrzenie nazw, które tworzą, jak sama nazwa wskazuje, przestrzeń, w której nazwa klasy musi pozostać unikatowa. Jeśli wykorzystane przez nas aplikacje posiadałyby przestrzenie nazw, np Blog oraz Forum, wówczas wspomniany błąd nie miałby miejsca.

Definiowanie przestrzeni nazw

Przestrzeń nazw musi zostać zdefiniowana w pierwszym wierszu pliku. W przeciwnym wypadku PHP zgłosi błąd. Przestrzeń nazw będzie miała wpływ klasy, funkcje oraz stałe.

namespace Foo;

class Bar
{
	public function baz()
	{
		$out = 'Przestrzen nazw: ' . __NAMESPACE__ . PHP_EOL
			 . 'Klasa: ' . __CLASS__ . PHP_EOL
			 . 'Metoda: ' . __METHOD__ . PHP_EOL;

		return $out;
	}
}

function funckja()
{
	return __FUNCTION__;
}

const STALA = 'abc';

Jeśli uruchomimy powyższy kod

$foo = new Foo\Bar();
echo $foo->baz();
echo Foo\funckja();
echo Foo\STALA;

uzyskamy w efekcie

Przestrzen nazw: Foo
Klasa: Foo\Bar
Metoda: Foo\Bar::baz
Foo\funckja
abc

W przypadku bardziej skomplikowanych projektów zachodzi potrzeba zagnieżdżania przestrzeni nazw. Definiowanie zagnieżdżonych przestrzeni nazw nie różni się niczym od “standardowych” przestrzeni. Nazwy kolejnych zagnieżdżeń oddzielamy, a jakże, backslashem.

namespace Foo\Bar\Baz;

Wszystkich, którzy czują się nieswojo bez klamer, ucieszy na pewno wiadomość, iż w przypadku przestrzeni nazw również możemy z nich korzystać.

namespace Foo
{
	/* klasy funkcje i stałe */
}

Zabawa z widocznością

Podobnie jak ma to miejsce w przypadku dołączania plików, przestrzenie nazw mogą spowodować zwiększenie ilości WTF na minutę. A to za sprawą sposobu w jaki PHP określa przestrzeń, w której się aktualnie znajdujemy. Jeśli nie straszne dla są zabawy ze ścieżkami plików, z tym również sobie poradzimy.

Manual wymienia trzy sposoby określania przestrzeni nazw wykorzystywanej klasy, funkcji lub stałej. Są to:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Michal Wachowski, dodany: 29.01.2011 00:47, tagi: php

W odwiecznej walce dobrego kodu z fuszerką, zawsze wygrywa prowizorka. Dziś, Kapitan Metoda wraz z przyjaciółmi prezentuje - klasę do robienia map stron w XML'u.

Autor wpisu: Zyx, dodany: 28.01.2011 12:09, tagi: php

Od kilku dni zajmuję się stopniową reaktywacją grupy Invenzzia. Jedną z rzeczy, która wymagała pilnego skodyfikowania, były zasady projektowania API oraz wykorzystywania poszczególnych elementów języka PHP w projektach. Celem jest podniesienie jakości kodu i poprawienie możliwości jego łączenia z innymi aplikacjami oraz bibliotekami. Programiści są różni, każdy ma jakieś swoje własne przyzwyczajenia, dlatego konieczne stało się spisanie zasad, co kiedy (nie) używać i dlaczego. Dzisiaj pragnę zaprezentować pierwszą wersję dokumentu do publicznej oceny.

Autor wpisu: Michal Wachowski, dodany: 27.01.2011 13:23, tagi: framework, mvc, php

Święta, święta i po świętach. Nim człowiek się nacieszył trzeba było wracać do roboty. Jako, że początek nowego roku to czas porządków - klienci, i ci starsi i ci obecni pragną by im coś zmodyfikować czy dobudować.W efekcie, większość czasu spędza

Autor wpisu: Śpiechu, dodany: 24.01.2011 20:10, tagi: mysql, php, zend_framework

Ostatnio w ramach sportów wyczynowych majstruję trochę z zapytaniami do bazy danych w Zendzie. Sprawdzam co można wycisnąć z obiektów Zend_Db_Select. Ten wpis zdecydowałem się podzielić na dwie części. W pierwszej pokażę jak wygenerować dosyć złożone zapytanie do bazy danych za pomocą kilku obiektów Zend_Db_Select, a w drugiej zajmiemy się stworzeniem formularza i odebraniem danych.

Naszym celem będzie utworzenie alfabetycznej listy polityków, których wszyscy lubimy wraz z ich powszechnie znanymi pseudonimami, np.

<select>
<option value="1">Donald Tusk</option>
<option value="2">Jareczek (Jarosław Kaczyński)</option>
<option value="3">Jarosław Kaczyński</option>
<option value="4">Słońce Peru (Donald Tusk)</option>
</select>

Najpierw musimy mieć skąd brać naszych wybrańców narodu. Stworzymy sobie bazę danych mniej więcej taką: Obrazek bazy danych polityków zrobiłem fajnym narzędziem online WWW SQL Designer. Schemat jest oczywiście maksymalnie uproszczony. Nie czepiać się, że imiona i nazwiska trzymam w jednym polu. Chodzi nam o relację jeden polityk ma wiele pseudonimów. Macie poniżej trochę kodu SQL wyeksportowanego przez phpMyAdmin plus kilka przykładowych wartości.

CREATE TABLE IF NOT EXISTS `politycy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `imie_nazwisko` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='tabela zawierajaca imiona i nazwiska politykow' AUTO_INCREMENT=3 ;
 
INSERT INTO `politycy` (`id`, `imie_nazwisko`) VALUES
(1, 'Donald Tusk'),
(2, 'Jarosław Kaczyński');
 
CREATE TABLE IF NOT EXISTS `politycy_ksywki` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ksywka` varchar(20) NOT NULL,
  `polityk_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `polityk_id` (`polityk_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='zawiera popularne pseudonimy politykow' AUTO_INCREMENT=3 ;
 
INSERT INTO `politycy_ksywki` (`id`, `ksywka`, `polityk_id`) VALUES
(1, 'Słońce Peru', 1),
(2, 'Jareczek', 2);
 
ALTER TABLE `politycy_ksywki`
  ADD CONSTRAINT `politycy_ksywki_ibfk_1` FOREIGN KEY (`polityk_id`) REFERENCES `politycy` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Następnie spróbujemy sobie wygenerować dosyć spore zapytanie SQL, które za jednym zamachem wypisze wszystkich polityków, wszystkie pseudonimy i dodatkowo w nawiasie wypisze którego polityka który pseudonim dotyczy. Wszystko oczywiście w Zend Framework.

// adapter bazy umieszczony w rejestrze
$dbAdapter = Zend_Registry::get('db');
$select1 = $dbAdapter->select()
   // podstawowa tabela z politykami
   ->from(array('p' => 'politycy'),
          // ktore pola (lacznie z aliasem)
          array('p.id','p.imie_nazwisko'));
// podzapytanie dla ksywek
$subSelect = $dbAdapter->select()  
   ->from(array('pp' => 'politycy'),
          array('pp.imie_nazwisko'))
   // warunek dla podzapytania
   ->where('pp.id = pk.polityk_id')
   // powinno przyspieszyc duze bazy
   ->limit(1);
$select2 = $dbAdapter->select()
   // tabela z ksywkami
   ->from(array('pk' => 'politycy_ksywki'),
          array('pk.polityk_id', 
                // Zend_Db_Expr konieczny przy wywolywaniu funkcji SQL
                new Zend_Db_Expr("CONCAT(pk.ksywka, ' (', ({$subSelect}) , ')')")));
$selectUnion = $dbAdaptery->select()
   // konstruujemy zapytanie typu union
   ->union(array($select1, $select2))
   // szeregujemy wyniki
   ->order('imie_nazwisko ASC');
$stmt = $select->query();
$rowset = $stmt->fetchAll();

Powyższy kod stworzył niczego sobie zapytanie:

SELECT `p`.`id`, `p`.`imie_nazwisko` FROM `politycy` AS `p` UNION SELECT `pk`.`polityk_id`, CONCAT(pk.ksywka, ' (', (SELECT `pp`.`imie_nazwisko` FROM `politycy` AS `pp` WHERE (pp.id = pk.polityk_id) LIMIT 1) , ')') FROM `politycy_ksywki` AS `pk` ORDER BY `imie_nazwisko` ASC

Zmienna $rowset zawiera wynik zapytania w postaci tablic:

array(4) {
  [0] => array(2) {
    ["id"] => string(1) "1"
    ["imie_nazwisko"] => string(11) "Donald Tusk"
  }
  [1] => array(2) {
    ["id"] => string(1) "2"
    ["imie_nazwisko"] => string(31) "Jareczek (Jarosław Kaczyński)"
  }
  [2] => array(2) {
    ["id"] => string(1) "2"
    ["imie_nazwisko"] => string(20) "Jarosław Kaczyński"
  }
  [3] => array(2) {
    ["id"] => string(1) "1"
    ["imie_nazwisko"] => string(27) "Słońce Peru (Donald Tusk)"
  }
}

Na koniec uwaga: obiekty typu Zend_Db_Select są przydatne tylko wtedy, gdy nasze zapytanie nie ma charakteru stałego, tzn. różne czynniki wpływają na jego kształt, przez co musi być tworzone w locie. Jeżeli wiemy, że zapytanie zawsze będzie takie samo to jest to zwykłe marnotrawstwo zasobów serwera, aczkolwiek ładnie wygląda i szybko się pisze.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.