Wpisy otagowane ‘funkcje’

Jak poprawiać cudzy kod czyli co w skrypcie piszczy.

czwartek, 29 Marzec 2012

Od jakiegoś czasu większość zleceń, które dostaję, dotyczy poprawiania i modyfikacji istniejących skryptów. Czasem jest to bardzo proste, ale nie zawsze. W zasadzie to prosto jest w małych skryptach składających się z kilku plików po kilkaset linii kodu. Większe projekty już takie nie są i dziwnym trafem nigdy nie posiadają aktualnej dokumentacji. Brzmi znajomo?

Nagle okazuje się, że zmienne, które trafiają do skryptu zostały przetworzone przez tajemnicze funkcje. Pojawiają się dziwne dane, a informacje, których się spodziewamy rozpłynęły się w meandrach protokołu HTTP. Co robić w takiej sytuacji?

Poniżej podaję trzy sposoby na poznanie interesujących informacji

Jak wyświetlić wszystkie zmienne przekazane do skryptu?

To stosunkowo proste i pewnie wielu z was zna ten sposób i stosuje, ale niektórzy nie dokopali się pewnie jeszcze do tego rozwiązania, więc proszę bardzo: print_r($GLOBALS);

Jak wyświetlić wszystkie zmienne zadeklarowane w skrypcie?

Wystarczy wywołać funkcję: print_r(get_defined_vars());

Jak wyświetlić wszystkie funkcje dostępne w skrypcie?

Wystarczy wywołać funkcję: print_r(get_defined_functions());

Mam nadzieję, że te informacje pomogą wielu z Was. Jeżeli chciałbyś podzielić się swoimi spostrzeżeniami, własnymi rozwiązaniami podobnych problemów, lub opisać jakąś ciekawszą sytuację, w której znalazłeś się rozwijając lub poprawiając cudzy kod, poniżej jest najlepsze do tego miejsce. Czekam na Twój komentarz.



Problemy z funkcjami.

czwartek, 15 Wrzesień 2011

Podczas niedawnych prac nad kursem dotyczącym integracji systemów płatności internetowych ze stroną WWW natknąłem się na wadliwe działanie funkcji htmlentities(). Problem polegał na tym, że ciągi znaków zakodowane w UTF-8 pomimo przesłania do funkcji informacji o kodowaniu, miały zamieniane litery ‘ó’ oraz ‘Ó’ na encje ‘ó’ oraz ‘Ó’. Sprawa wygląda dosyć dziwnie, bo szukając informacji o tym błędzie natknąłem się na kilka dyskusji i podobne problemy napotkali też inni programiści, ale niekoniecznie dotyczyły one tych samych liter.

Rozwiązanie problemu jest oczywiście dosyć proste. Należy encje zamienić z powrotem na odpowiedni litery. Należy przy tym pamiętać, by plik z kodem był również zakodowany w UTF-8.

<?php
	$value=htmlentities($value, ENT_COMPAT, 'UTF-8');
	$value=str_replace(array('&oacute;', '&Oacute;'), array('ó', 'Ó'), $value);
?>

Funkcja str_replace() zamienia w zmiennej $value fragmenty z tablicy, która jest pierwszym argumentem tej funkcji na elementy tablicy, która jest argumentem drugim.

Z kolei wczoraj, konfigurując portal pewnej szkoły zauważyłem, że w pewnych miejscach polskie znaki również nie wyświetlają się poprawnie. Przeglądarka poprawnie interpretowała kodowanie strony, również w bazie danych wszystkie napisy były zapisane prawidłowo. Po bliższym przyjrzeniu się problemowi, winowajcą okazała się funkcja strtolower() zmieniająca wszystkie znaki na małe. Funkcja ta również nie radziła sobie z kodowaniem UTF-8. W tym przypadku jednak znalazł się zamiennik: funkcja mb_strtolower(). Jej użycie dla tekstów kodowanych w UTF-8 wygląda następująco

<?php
	$tytul=mb_strtolower($tytul, 'UTF-8');
?>


Programowanie obiektowe w PHP

środa, 10 Listopad 2010

Dzięki programowaniu obiektowemu możemy tworzyć rozbudowane programy w uporządkowany sposób. Umożliwia nam to podział programu na odrębne części – klasy. W klasie wyodrębniamy fragmenty programów, które są jakąś logiczną całością, odpowiadającą za jedną funkcjonalność, albo jeden spójny zbiór danych.

Ta logiczna całość może być wykorzystana wiele razy w jednym programie, jak również w innych programach. W miejscu, gdzie chcemy użyć daną klasę, tworzymy obiekt tej klasy. Obiektów może być kilka. Stosujemy je wszędzie tam, gdzie potrzebna jest nam dana funkcjonalność, jeżeli tę funkcjonalność musimy zmienić, robimy to w jednym miejscu – w definicji klasy. Skutki tej zmiany będą widoczne wszędzie tam, gdzie występują obiekty tej klasy.

Podobna sytuacja występuje w przypadku, gdy w programie wystąpi jakiś błąd. Ten sam błąd może wystąpić w wielu miejscach, ale dzięki temu, że program jest oparty na klasach i obiektach tych klas, to przyczyna błędu występuje tylko w jednym miejscu w kodzie całego programu – w definicji klasy. Gdy usuniemy błąd, usterka znika z każdego miejsca, w którym wystąpiła.

I coś, co dla wielu będzie prawdopodobnie najważniejszą zaletą. Umiejętność programowania obiektowego umożliwia używanie frameworków i stosowanie wzorców projektowych, co szalenie ułatwia i przyspiesza proces powstawania programów.

Teraz jak to wygląda w praktyce. Utworzę klasę Notatka

class Notatka
{
	private $autor;
	private $notatka;
 
	public function zapisz_autora($autor)
	{
		$this->autor=$autor;
	}
 
	public function zapisz_notatke($notatka)
	{
		$this->notatka=$notatka;
	}
 
	public function wyswietl()
	{
		echo '<h2>'.$this->autor.'</h2>';
		echo '<p>'.$this->notatka.'</p>';
	}
}
 
$obiekt =new Notatka();
$obiekt->zapisz_autora($_POST['autor']);	
$obiekt->zapisz_notatke($_POST['notatka']);	
$obiekt->wyswietl();

Klasa

Klasa jest prototypem obiektu – strukturą zawierającą zarówno dane (pola klasy) jak i funkcje (metody klasy).
Klasę definiuje się słowem kluczowym class po którym podajemy nazwę klasy, a następnie wewnątrz nawiasów klamrowych definiujemy jej pola i metody.

Obiekt

Obiekt jest instancją klasy zawierającą się w konkretnej zmiennej wykorzystywanej w kodzie programu.
Obiekt danej klasy tworzy się podstawiając do zmiennej instancję klasy tworzoną operatorem new. Dostęp do pól i metod klasy następuje poprzez nazwę zmiennej, operator ->, a następnie nazwę pola lub metody. Dostęp do pól i metod wewnątrz klasy otrzymuje się poprzez referencję $this->

Kwalifikatory dostępu

Definiując wewnątrz klasy pola i metody używamy kwalifikatorów dostępu. Do dyspozycji mamy trzy kwalifikatory dostępu: public, private, protected. Składowe o dostępie public są dostępne zarówno wewnątrz klasy jak i na zewnątrz. Do składowych o dostępie private dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana. Do składowych o dostępie protected dostęp istnieje jedynie z wewnątrz klasy, w której składowa została zdefiniowana, oraz klas potomnych.

Metody

Metody klasy są funkcjami zdefiniowanymi wewnątrz klasy. Stosują się do nich wszystkie zasady związane ze zwykłymi funkcjami z uwzględnieniem kwalifikatorów dostępu.

Pola

Pola klasy są składowymi klasy przechowującymi dane dowolnego typu. Stosują się do nich wszystkie zasady dotyczące zwykłych zmiennych z uwzględnieniem kwalifikatorów dostępu.



Co robią i czym się różnią funkcje isset() i empty()

środa, 23 Wrzesień 2009

Wielu początkujących programistów php ma problemy z stosowaniem funkcji isset() oraz empty() – nie w każdej sytuacji potrafią jednoznacznie określić jaką wartość powinny te funkcje zwracać dla określonych argumentów. By wyjść im na przeciw postanowiłem zebrać najczęściej występujące przypadki i je wyjaśnić.

<?php
echo isset($a);
echo empty($a);
$a=NULL;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a nie istnieje lub ma wartość NULL, funkcja isset($a) zwróci wartość false, a funkcja empty($a) zwróci wartość true.

<?php
$a=true;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a ma wartość true, funkcja isset($a) zwróci wartość true, a funkcja empty($a) zwróci wartość false.

<?php
$a=false;
echo isset($a);
echo empty($a);
$a=0;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a ma wartość false lub 0, funkcje isset($a) i empty($a) zwrócą wartość true.

<?php
$a=-3;
echo isset($a);
echo empty($a);
$a=1.36;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a ma wartość liczbową różną od 0, to isset($a) zwróci wartość true, a funkcja empty($a) zwróci wartość false.

<?php
$a=”;
echo isset($a);
echo empty($a);
$a=’0′;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a jest pustym łańcuchem znaków lub łańcuchem składającym się z pojedynczego znaku ’0′, funkcje isset($a) i empty($a) zwrócą wartość true.

<?php
$a=’000′;
echo isset($a);
echo empty($a);
$a=’ ‘;
echo isset($a);
echo empty($a);
$a=’Ala ma 3/4 kota’;
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a zawiera kilka znaków ’0′, lub zawiera znak spacji lub jest dowolnym innym ciągiem znaków, to isset($a) zwróci wartość true, a funkcja empty($a) zwróci wartość false.

<?php
$a=array();
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a jest tablicą nie zawierającą żadnych elementów, funkcje isset($a) i empty($a) zwrócą wartość true.

<?php
$a=array(NULL);
echo isset($a);
echo empty($a);
$a=array(false);
echo isset($a);
echo empty($a);
$a=array(0);
echo isset($a);
echo empty($a);
$a=array(”);
echo isset($a);
echo empty($a);
?>

Gdy zmienna $a jest tablicą zawierającą puste elementy np. NULL, false, 0, pusty łańcuch znaków, to isset($a) zwróci wartość true, a funkcja empty($a) zwróci wartość false.

<?php
$a=array(‘kolor’ => ‘zielony’);
echo isset($a['kształt']);
echo empty($a['kształt']);
$a=array(‘krokodyl’, ‘żaba’, ‘hipopotam’);
echo isset($a[8]);
echo empty($a[8]);
class Test
{
var $a;
}
$a=new Test();
echo isset($a->a);
echo empty($a->a);
?>

Gdy odwołujemy się do nieistniejącego klucza lub indeksu tablicy albo do pustego pola obiektu, funkcja isset($a) zwróci wartość false, a funkcja empty($a) zwróci wartość true.

Dla wygody wszystkie rozpatrywane przypadki zebrałem w tabelce poniżej.

badany element isset() empty()
brak zmiennej false true
NULL false true
wartość logiczna true true false
wartość logiczna false true true
wartość liczbowa 0 true true
inna wartość liczbowa true false
pusty łańcuch znaków true true
łańcuch znaków zawierający zero true true
łańcuch znaków zawierający wiele zer true false
spacje true false
dowolny ciąg znaków true false
pusta tablica true true
tablica zawierająca puste elementy
(np. o wartościach NULL, false, 0, pusty łańcuch znaków)
true false
nieistniejący klucz tablicy false true
nieistniejący indeks tablicy false true
pole klasy bez podstawionej wartości false true