Blog php

php news, php tutorial – porady programisty

.Net framework

sobota
paź 24,2009

Jest to biblioteka uruchomieniowa działająca w środowisku Microsoft Windows, wymagana jest to użytkowania programów napisanych w językach .NET. Zatem na pierwszy rzut oka można by pomyśleć że to pewnego rodzaju ograniczenie, ależ nic bardziej mylnego! Programy napisane w języku .NET są kompilowane do tak zwanego kodu pośredniego i podczas pierwszego uruchomienia aplikacji na danym komputerze, zostaje kod pośredni przekształcony w kod maszynowy, dostosowany do systemu operacyjnego i architektury procesora posiadanego przez użytkownika.

Co w tym takiego cudownego? Wydaje się, że to tylko nie potrzebna strata zasobów na ten cały .NET Framework, a jednak! Dzięki takiemu podejściu do sprawy, programista nie musi się martwić już jaki system operacyjny czy też procesor będzie posiadał użytkownik ponieważ korzysta z .NET Framework’a, który sam oceni co trzeba wykonać, aby wszędzie kod został poprawnie zinterpretowany. To nie koniec udogodnień jakie niesie nam .NET Framework, jednym z najważniejszych – moim zdaniem – jest możliwość z korzystania z bibliotek napisanych w innych językach! Pozwala na to na bezproblemowe używanie kodu napisanego w innym języku (pod warunkiem że korzysta z .NET Framework’a). Znika problem kompatybilności innych bibliotek i to jest całe piękno Framework’ów. Biblioteka napisana do tego samego framework’a bez problemów zostaje uruchomiona i w pełni kompatybilna z całą aplikacja.

Więcej praktyki

piątek
paź 23,2009

Jeżeli wyjątek nie zostaje pochwycony, zostaje wyświetlona informacja niesiona z wyjątkiem, wraz z jednoczesnym zatrzymywaniem wykonywania skryptu w miejscu jego wystąpienia. Powinieneś już wiedzieć bardzo dużo na temat wyjątków, przedstawię jeszcze jak to działa w praktyce.

<?php
class MyException extends Exception {}
echo 'Test 1'."\n";
try {
throw new MyException();
}
catch( MyException $e ) {
// Ten kod zostanie wykonany
echo '1. MyException'."\n";
}
catch( Exception $e ) {
// pominięty ponieważ blok powyżej został wykonany
echo '1. Exception'."\n";
}
// Dalszy kod wykonany :)
echo 'Test 2'."\n";
try {
throw new Exception();
}
catch( MyException $e ) {
// Ten kod zostanie pominięty, nie pasuje do wyjątku
echo '2. MyException'."\n";
}
catch( Exception $e ) {
// Ten kod zostanie wykonany
echo '2. Exception'."\n";
}
// Dalszy kod wykonany :)
echo 'Test 3'."\n";
try {
throw new MyException();
}
catch( Exception $e ) {
// Ten kod zostanie wykonany, ponieważ MyException dziedziczy Exception
echo '3. Exception'."\n";
}
// Dalszy kod wykonany :)
echo 'Test 4'."\n";
try {
// tu nie będzie wyjątku
$sNull = null;
}
catch( Exception $e ) {
// pominięty, ponieważ nie ma wyjątku
echo '4. Exception'."\n";
}
echo 'Koniec'."\n";
?>

Proponuje abyś sam uruchomił ten kod i wyciągną wnioski patrząc na źródło i efekt wyświetlony w przeglądarce. Chyba ten przykład rozwiał wszelkie Twoje wątpliwości, dotyczące działania wyjątków.

środa
paź 14,2009

Ponieważ wyjątek jest obiektem możemy sobie go dopasować do naszych potrzeb. Dodanie nowych metod czy właściwości nie sprawi problemu, a może znacznie ułatwić nam prace z naszym systemem.

<?php
class LogEx {
static protected $aLog = array();
static public function add( ProException $Ex ) {
self::$aLog[] = $Ex;
}
static public function get() {
return self::$aLog;
}
}
class ProException extends Exception {
protected $bHandle = false;
public function __construct( $sMessage, $iCode = 0 ) {
parent::__construct( $sMessage, $iCode );
$this->bHandle = false;
LogEx::add( $this );
}
public function handled() {
$this->bHandle = true;
}
public function inHandled() {
return $this->bHandle;
}
public function __toString() {
return __CLASS__ . ': ['.$this->code.']: '.$this->message."\n";
}
}
?>

Powyższy kod obrazuje nam jak bardzo prosto możemy zrobić z wyjątkami to, co nam jest potrzebne. Rozbudowałem wyjątek tak, że będzie on raportował o swoim stanie, to znaczy jest dodawany do listy wyjątków i jeżeli programista go obsłuży, np tak:

<?php
try {
throw new ProException( 'Test' );
}
catch( ProException $Ex ) {
// obsłużony
$Ex->handled();
}
$aExList = LogEx::get();
foreach( $aExList As $Ex ) {
echo ( $Ex->inHandled() ? 'Złapany' : 'Nie złapany' ).' : ', $Ex;
}
?>

Dzięki temu, mamy dostęp do listy wszystkich wyjątków jakie pojawiły się nam podczas pracy systemu. Zostajemy także poinformowani czy systemowi udało się rozwiązać problem. W bardzo prosty sposób możemy także oddać opis jak z danym problemem system sobie poradził.

Oczywiście to co zrobicie z własnymi obiektami zależy tylko od waszej wyobraźni i potrzeb. :-)