Nowe narzędzia – nowe możliwości

9 czerwca 2015

Dawno nic nie pisałem. Ktoś mógłby powiedzieć, że nie miałem już o czym. Oczywiście nie miał by racji, bo droga, którą wybrałem, jak żadna inna, wymaga ciągłego poznawania nowych, często pasjonujących obszarów wiedzy, nabywania i doskonalenia umiejętności, których rok wcześniej jeszcze nikt nie posiadał oraz wybierania własnej ścieżki. Bo droga programisty, webmastera, twórcy aplikacji internetowych nie jest jednorodnym szerokim traktem, ale plątaniną ścieżek, które co chwilę wybieramy za każdym razem gdy ta, po której kroczymy rozdwaja się, roztraja, lub krzyżuje z inną. Dziś w języku PHP mamy wiele możliwości: frameworki, CMS-y – zarówno te popularne od lat, ale w nowych wersjach, jak i zupełnie nowe, często o egzotycznych nazwach i równie egzotycznych rozwiązaniach.

Moje poszukiwania i doświadczenia doprowadziły mnie przed ponad trzema laty do zespołu, który buduje do dzisiaj i ja do dzisiaj w tych pracach uczestniczę, aplikacje internetowe na Drupalu. Jest to narzędzie o dużych możliwościach – połączenie prostoty i wydajności tworzenia CMS-a z możliwościami i mocą frameworka. Według mnie jest to przyszłość Internetu. Może nie będzie to narzędzie dla każdego… Myślę, że raczej jest to narzędzie dla najlepszych, najbardziej kreatywnych i otwartych na rozwój, którzy pokażą drogę innym. Nie będę się rozpisywał nad uzasadnieniem tych słów. Wystarczy przeczytać, co o Drupalu mówi Wikipedia: http://pl.wikipedia.org/wiki/Drupal.

Spodziewajcie się w najbliższym czasie więcej informacji na temat Drupala. Może ktoś już się z nim zetknął, może ma jakieś uwagi, albo szuka rozwiązania specyficznych problemów? Jeżeli podzieli się tym w komentarzach, możliwe, że będę mógł mu pomóc. Liczę też na wasze opinie: czy chcielibyście poznawać Drupala od samych podstaw (te są raczej proste), czy chcielibyście poznać bardziej zaawansowane tematy? Im ktoś lepiej zna HTML, CSS, JavaScript, PHP czy bazy danych, tym łatwiej będzie mu wyciągnąć z Drupala maksimum możliwości, bo to narzędzie sprawia, że te wszystkie umiejętności stają się wyjątkowo wydajne. Dlatego zachęcam do zapoznania się z wcześniejszymi materiałami z działu „Sekrety Webmasterów”, bo każda wiedza w nich zawarta, może się okazać przydatna.

Zachęcam więc do zainteresowania się tym jak wielkie możliwości może dać ci Drupal i do podzielenia się poniżej swoimi uwagami i sugestiami.

Ruch na stronie z jQuery

15 października 2013

Nie będę pisał o tym, jak zwiększyć ruch na stronie w sensie ilości użytkowników odwiedzających serwis, tylko o wprowadzeniu ruchomych elementów reagujących na określone zachowania użytkownika. Skorzystam przy tym z dobrodziejstw JavaScriptu i biblioteki jQuery. Jeżeli nie znasz jQuery, przeczytaj Co mogę zrobić z jQuery?.

Efekt, którego realizację chcę tu przybliżyć, zaprezentowałem poniżej. Najedź myszą na kolejne grafiki. Dalej znajdziesz kolejne etapy jego realizacji.

Obraz 1.

Obraz 2.

Obraz 3.

Obraz 4.

Obraz 5.

Obraz 6.

Zaczniemy od kodu HTML:

<div id="photos">
<div class="photo">
 	<div class="text"><p>Obraz 1.</p></div>
 	<img src="img1.jpg" id="p1" />
</div>
<div class="photo">
 	<div class="text"><p>Obraz 2.</p></div>
 	<img src="img2.jpg" id="p2" />
</div>
<div class="photo">
 	<div class="text"><p>Obraz 3.</p></div>
 	<img src="img3.jpg" id="p3" />
</div>
<div class="photo">
 	<div class="text"><p>Obraz 4.</p></div>
 	<img src="img4.jpg" id="p4" />
</div>
<div class="photo">
 	<div class="text"><p>Obraz 5.</p></div>
 	<img src="img5.jpg" id="p5" />
</div>
<div class="photo">
 	<div class="text"><p>Obraz 6.</p></div>
 	<img src="img6.jpg" id="p6" />
</div>
</div>

Całość znajduje się w znacznikach div z identyfikatorem photos. W zależności od szerokości tego elementu w jednym wierszu znajdzie się większa lub mniejsza liczba grafik. Każda grafika składa się z dwóch części: górnej – widocznej od razu i dolnej – pokazującej się po najechaniu myszą. Do elementów img dodałem identyfikatory. Grafiki poprzedzone są opisami zawartymi w elementach div klasy text, a łącznie z grafiką w elementach div klasy photo. Te divy służą do ograniczenia widoczności grafik do połowy ich wysokości, co jest realizowane przez definicje styli CSS:

#photos
{
 	width: 750px;
 	margin: 20px auto;
}
.photo 
{
 	width: 350px;
 	height: 350px;
 	overflow: hidden;
 	display: inline-block;
 	position: relative;
}
img 
{
 	display: none;
 	position: relative;
 	top: 0px;
}
.text 
{
 	width: 100%;
 	height: 100px;
 	background: #fff;
 	position: absolute;
 	left: 0px;
 	bottom:-100px;
 	z-index: 100;
}

Div photos swoją szerokością ogranicza ilość grafik w wierszu. Klasa photo definiuje widoczny obszar dla każdego pliku graficznego do kwadratu o boku 350px. Właściwość overflow ustawiona na hidden ukrywa paski przewijania dla zawartości nie mieszczących się w zdefiniowanym obszarze, display: inline-block sprawia, że elementy tej klasy zachowują się na zewnątrz jak elementy liniowe (ustawiają się jeden za drugim), a wewnątrz są elementami blokowymi zachowującymi zdefiniowane wymiary. Pozycjonowanie relatywne pozwoli na użycie tych elementów jako odniesienia dla elementów zawartych wewnątrz nich. Elementy img początkowo nie są widoczne. Za ich pokazanie będzie odpowiedzialny odpowiedni kod jQuery. Pozycjonując te elementy będziemy mogli wpływać na ich wartość top liczoną względem zewnętrznego elementu pozycjonowanego relatywnie. Została nam jeszcze klasa text. Elementy tej klasy ze względu na to, że są mniejsze niż element nadrzędny są pozycjonowane absolutnie, czyli właściwość bottom odnosi się do dolnej krawędzi elementu nadrzędnego, a nie elementu klasy text. Ujemna wartość ukrywa tekst pod dolną krawędzią elementu klasy photo, a z-index z wartością 100 gwarantuje pojawianie się tekstu na, a nie pod grafiką.

Teraz ostatnia i najważniejsza część, czyli kod jQuery:

$(document).ready(function()
{
	$('#p1').fadeIn(1000);
 	$('#p2').delay(200).fadeIn(1000);
 	$('#p3').delay(400).fadeIn(1000);
 	$('#p4').delay(600).fadeIn(1000);
 	$('#p5').delay(800).fadeIn(1000);
 	$('#p6').delay(1000).fadeIn(1000);
 
 	$('.photo').mouseover(function()
 	{
 		if($('img',this).queue('fx').length==0)
		{
			$('img',this).animate({'top':'-350px'},500);
			$('div',this).delay(200).animate({'bottom':'0px'},800);
		}
 	});
 	$('.photo').mouseleave(function()
 	{
 		if($('img',this).queue('fx').length<2)
		{
			$('div',this).animate({'bottom':'-100px'},400);
			$('img',this).delay(200).animate({'top':'0px'},700);
		}
	});
});

Skrypt rozpoczynamy od pokazania kolejnych grafik z efektem fadeIn. Efekt dla każdego kolejnego obrazka odpala się z opóźnieniem 200 ms względem poprzedniego (funkcja delay() z argumentem o 200 wyższym od poprzedniego). Poniżej mamy obsługę dwóch zdarzeń: mouseover i mouseleave. W pierwszym przypadku mamy dwie animacje funkcją animate(). Najpierw przewijamy w górę grafikę, a potem tekst. Całość jest zawarta w instrukcji warunkowej, którą na razie pominę. Warto sprawdzić zachowanie skryptu bez instrukcji if przy jednym i drugim zdarzeniu. W mouseleave najpierw tekst wraca na miejsce początkowe (tuż pod dolną krawędź widocznego obszaru), a następnie grafika zjeżdża w dół.

Ponieważ w jQuery efekty animacji są kolejkowane, to wszystkie zdarzenia powodujące wywołanie animacji, będą dokładały te animacje do kolejki. Szybkie, kilkukrotne najechanie i opuszczenie kursorem myszy tej samej grafiki spowoduje utworzenie kolejki wielu efektów, które będą musiały być wykonane. Użytkownik nie będzie już nic robił, a obrazki będą się przesuwały w górę i w dół tyle razy, ile razy te efekty zostały wcześniej dodane do kolejki. Rozwiązaniem tego problemu jest kontrolowanie ilości efektów w kolejce, co umożliwia nam właściwość length obiektu queue. Właśnie tę funkcję realizują instrukcje warunkowe w obsłudze zdarzeń. W pierwszym przypadku nowe animacje będą dodane tylko w sytuacji gdy kolejka jest pusta. W drugim bierzemy pod uwagę fakt, że pierwsza faza może nie zostać zakończona, więc jeden efekt może jeszcze być obecny w kolejce.

Zaprezentowany w tym artykule przykład nie będzie działał poprawnie w przeglądarkach IE8 i wcześniejszych ze względu na użytą wartość display: inline-block, której wymienione przeglądarki nie obsługują. Jeżeli komuś zależy na tych przeglądarkach powinien wymienić display: inline-block na float: left. Możliwe, że będzie to wymagało dopracowania kilku innych szczegółów.

Kto trafił szóstkę?

6 grudnia 2012

Poprzedni artykuł zakończyłem krótkim zadaniem. Prosiłem o policzenie, bez wykonywania tego kodu na serwerze, jaką liczbę wyświetli poniższy kod.

<?php
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;
?>

Nie kwapiliście się specjalnie z odpowiedziami. Nie wiem, czy to brak pewności siebie, by ujawnić swoje obliczenia, czy niechęć do liczenia czegokolwiek. Fakty są takie, że 3 osoby podały 5 odpowiedzi, a żadna z nich nie była poprawna. W związku z tym postanowiłem wyjaśnić ten, przyznam że podchwytliwy, przykład. W tym celu rozbiję obliczenia na kilka kolejnych etapów, z których każdy opatrzę komentarzem. Dla przypomnienia: ++ zwiększa wartość zmiennej o 1, –– zmniejsza. Operator przed zmienną zmienia jej wartość przed jej użyciem, za zmienną po jej użyciu

<?php
	$a=8;
	echo $a--;				//W tej linii operator zmniejsza wartość zmiennej o 1, ale po jej użyciu. 
						//$a jest równe 7, ale użyte w instrukcji (wyświetlone) było 8 
						//(operator za zmienną).
 
	$a=8;
	echo $a--+5*--$a;			//Do 8 dodajemy 5*6. Wartość zmiennej $a została ponownie zmniejszona. 
						//Tym razem przed jej użyciem (operator przed zmienną). Instrukcja wyświetli 38
 
	$a=8;
	echo $a--+5*--$a+3*$a--;		//Do 38 dodajemy 3*6, ale $a równe jest 5. Użyta była wartość przed 
						//zmniejszeniem (operator za zmienną). Instrukcja wyświetli 56
 
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++;		//Do 56 dodajemy poprzednią wartość $a czyli 5, a następnie 
						//zwiększamy ją o 1 (operator za zmienną). Instrukcja wyświetli 61
 
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;	//Od 61 odejmujemy 2*6. Instrukcja wyświetli 49
?>

Operatory arytmetyczne w PHP

1 grudnia 2012

W PHP operatory służą do wykonywania działań na zmiennych. Jest to zagadnienie dosyć proste, ale w pewnych przypadkach bywa dosyć ciekawe. Na tych właśnie przypadkach będę chciał się skupić. Dla porządku przedstawiam tabelkę zawierającą operatory arytmetyczne z przykładami ich zastosowania.

operator przeprowadzana operacja
+ dodawanie $a=$b+3;
- odejmowanie $a=$b-3;
* mnożenie $a=$b*3;
/ dzielenie $a=$b/3;
% dzielenie modulo (zwraca liczbę całkowitą stanowiącą resztę z dzielenia)
++ inkrementacja $a++ ( dodaje do zmiennej wartość 1)
–– dekrementacja $a––(odejmuje od zmiennej wartość 1)

Myślę, że 4 pierwsze operatory nie wymagają żadnych wyjaśnień. Kolejny operator % czyli dzieleni modulo wyjaśnię na dodatkowym przykładzie. Załóżmy, że mamy do wyświetlenia na stronie 37 ikonek. Chcemy to zrobić w tabelce mającej 4 kolumny. Od razu widać, że ostatni wiersz tabeli nie będzie wypełniony do końca. Aby tabelka wyglądała przyzwoicie, musimy wiedzieć ile pustych komórek należy umieścić w ostatnim wierszu. Tę wartość możemy policzyć np. w taki sposób:

<?php
	$elementy = array('ikona1.png', 'ikona2.png', ..., 'ikona37.png');	//tablica z 37 ikonkami
	$liczba_kolumn = 4;
	$liczba_pustych_komorek_na_w_ostatnim_wierszu = $liczba_kolumn - count($elementy) % $liczba_kolumn;
?>

Mam tablicę $elementy z 37 ikonkami i zmienną $liczba_kolumn. W kolejnej instrukcji funkcją count() obliczam ilość elementów tablicy i otrzymuję wartość 37. Na otrzymanym wyniku wykonuję operację modulo (%), która w wyniku daje mi wartość 1. Odejmuję tę wartość od liczby kolumn i otrzymuję ilość komórek, które muszę uzupełnić.

Kolejne dwa operatory to inkrementacja i dekrementacja. Obydwa mogą występować zarówno przed, jak i po zmiennej. Jeżeli występują przed, to wartość zmiennej jest najpierw zmieniana przez operator, a dopiero potem nowa wartość jest wykorzystywana. Jeżeli operator jest umieszczony za zmienną, to najpierw wykorzystywana jest wartość zmiennej, a dopiero później działa operator inkrementacji lub dekrementacji.

Doskonale zdaję sobie sprawę, że powyższe wyjaśnienie może być mało czytelne, dlatego posłużę się ponownie przykładem:

<?php
	$a=5;
	echo $a++;		//najpierw wyświetlana jest wartość zmiennej - czyli 5, a następnie operator '++' zmienia jej wartość do 6.
	echo $a;		//wyświetlana jest nowa wartość - czyli 6
	echo ++$a;		//ty razem najpierw zwiększa się wartość zmiennej do 7 i ta właśnie nowa wartość jest wyświetlana
?>

Myślę, że teraz wszyscy już doskonale rozumieją na czym to polega. Jeżeli ktoś chciałby się sprawdzić, to proszę policzyć, ale bez komputera, jaki wynik wyświetli poniższy kod. Wyniki proszę podawać w komentarzach. Jeżeli zetknąłeś się z tym tematem po raz pierwszy, nie przejmuj się, jeżeli sprawi Ci trudność. Na jednym ze szkoleń, które ostatnio prowadziłem, przy 8 uczestnikach, padło 9 różnych odpowiedzi.

<?php
	$a=8;
	echo $a--+5*--$a+3*$a--+$a++-2*$a;
?>

Typ string, czyli ciągi znaków w PHP

27 września 2012

Jako ciąg znaków traktowane są wszystkie napisy znajdujące się pomiędzy ‘ a ‘ lub " a ". Przy tym ciągi znaków umieszczone pomiędzy " a " są interpretowane przez PHP. W związku z tym wpisanie poniższych linijek kodu nie we wszystkich przypadkach da te same rezultaty.

<?php
  $wiek=3;
  echo '<p>Ala ma 3 lata.</p>';
  echo "<p>Ala ma 3 lata</p>";
  echo "<p>Ala ma $wiek lata</p>";
  echo '<p>Ala ma $wiek lata</p>';
  echo "<p>Ala ma $wiek lata</p>";
  echo '<p>Ala ma '.$wiek.' lata</p>';
  echo "<p>Ala ma ".$wiek." lata</p>";
?>

Aby wewnątrz " i " wyświetlić znaki specjalne należy je „zacytować” – poprzedzić symbolem „\” (backslash).

<?php
  $lata=36;
  echo "Zmienna \$lata ma wartość $lata.";
?>

Najczęściej wykorzystywane znaki specjalne to:

  • \$ – dolar
  • \” – podwójny apostrof
  • \n – koniec linii
  • \r – powrót karetki
  • \t – tabulator

W przypadku ciągów znaków w pojedynczych apostrofach, cytowania wymaga jedynie apostrof.

<?php
  echo 'Ciąg znaków umieszczony pomiędzy \' a \'.';
?>

True lub false – typ logiczny w PHP

14 września 2012

W tym artykule przedstawię typ logiczny (bool), Zmienne tego typu mogą przyjmować dwie wartości logiczne – prawda lub fałsz; zapisane jako true i false. Wartości mogą być też zapisane wielkimi literami.

<?php
  $prawda=true;
  $falsz=false;
?>

Do rzutowania na typ logiczny służy (bool) lub (boolean). Wartości innych typów przy rzutowaniu na typ logiczny będą przyjmowały wartość false w przypadkach:

  • liczba całkowita 0
  • liczba zmiennoprzecinkowa 0.0
  • pusty ciąg znaków
  • ciąg znaków ’0′
  • tablice z zerową ilością elementów
  • wartość null

<?php
  $nie=(bool)0;
  $tak=(boolean)34;
  $nie2=(bool)0.0;
  $nie3=(bool)'';
  $nie4=(bool)'0';
  $nie5=(bool)array();
  $nie6=(bool)null;
?>

Float, double, real czyli typ zmiennoprzecinkowy w PHP

29 sierpnia 2012

Kolejny artykuł o typach. Dziś przedstawię typ zmiennoprzecinkowy, czyli typ który pozwala zapisać wartości rzeczywiste np. 4.487376 albo 0.00000000000341

Wartości tego typu możemy zapisywać w notacji zwykłej i naukowej.

<?php
  $liczba5=9.49;		//Zapis zwykły
  $liczba6=19.401e-4;	//Notacja naukowa liczby  0.0019401
?>

Liczby zmiennoprzecinkowe mają ograniczoną precyzję. Zazwyczaj jest to 1.11e-16. Reprezentacja wewnętrna liczb zmiennoprzecinkowych powoduje, że ostatnia cyfra liczby nie jest całkowicie wiarygodna.

<?php
  echo (int)((0.7+0.1)*10);	//wyświetli 7
?>

Do rzutowania na typ zmiennoprzecinkowy służy (float), (double) lub (real). Jeżeli w obliczeniach pierwszym elementem jest liczba typu zmiennoprzecinkowego lub ciąg znaków, który po rzutowaniu jest typu zmiennoprzecinkowego, to wynik działania jest również rzutowany na typ zmiennoprzecinkowy.

<?php
  $liczba1=(float)'3.4';
  $liczba2=(double)4*2;
  $liczba3=(real)99;
  $liczba4=2.5*8;
  $liczba5='0.75'*4;
?>

Int, integer czyli typ całkowity w PHP

17 sierpnia 2012

Jak pewnie wszyscy wiedzą w języku PHP tworząc nową zmienną nie podajemy jej typu. Typ zmiennej jest określany przez jej wartość. Są to podstawy i jeżeli przynajmniej próbowałeś programować w PHP, to powinno być dla Ciebie oczywiste. Nie oznacza to wcale, że do programowania nie potrzebna jest absolutnie żadna wiedza o typach. Dziś przedstawię kilka informacji o typie całkowitym.

Wartości tego typu możemy zapisywać w formie dziesiętnej, binarnej, ósemkowej i szesnastkowej.

<?php
  $liczba1=2012;		//Liczba dziesiętna
  $liczba2=-99;		//Liczba ujemna
  $liczba3=0b1001010;	//Liczba 2012 w zapisie binarnym
  $liczba4=03734;	//Liczba 2012 w zapisie ósemkowym
  $liczba5=0x7DC;	//Liczba 2012 w zapisie szesnastkowym
?>

Liczby całkowite w systemach 32 bitowych zawierają się w zakresie od -2147483647 do 2147483647, a w systemach 64 bitowych w zakresie od -9223372036854775807 do 9223372036854775807. Po przekroczeniu zakresu typ liczby zamieniany jest na float.

Do rzutowania na typ całkowity służy (int) lub (integer).

<?php
  $liczba1=(int)89/5;
  $liczba2=(integer)45/8;
  echo $liczba1.'<br />';
  echo $liczba2.'<br />';
?>

Rzutowanie powoduje przycięcie wartości wyrażenia do części całkowitej. W powyższym przypadku zostaną wyświetlone wartości 17 i 5.

Jaki jest zasięg zmiennych w JavaScript

12 czerwca 2012

Zasięg zmiennych w JavaScript może dla niektórych okazać się zaskakujący. Wystarczy jednak uruchomić poniższy kod, by wszystko stało się jasne.

<html>
<script type="text/javascript">
var a=1;
var b=2;
var c=3;
 
zasieg(a);
 
function zasieg(a)
{
	var b;
	a++;
	b++;
	c++;
	alert(a+' '+b+' '+c);
}
 
alert(a+' '+b+' '+c);
</script>
</html>

Każda z wymienionych trzech zmiennych zachowuje się inaczej. Zmienna a z początkową wartością 1 jest przekazana do funkcji zasieg() jako argument. W związku z tym wewnątrz funkcji jest zmienną lokalną. Inkrementacja tej zmiennej wewnątrz funkcji nie wpływa na wartość zmiennej a poza funkcją. Pierwsza instrukcja alert(a+’ ‘+b+’ ‘+c) wyświetli wartość 2 dla zmiennej a, natomiast druga - wartość 1.

Zmienna b jest ponownie tworzona wewnątrz funkcji, wobec czego jest to całkowicie nowa zmienna i nie posiada wartości, a więc nie podlega również inkrementacji. Instrukcja alert(a+’ ‘+b+’ ‘+c) wewnątrz funkcji wyświetli dla zmiennej b NaN (not a number – wartość nie numeryczna). Natomiast poza funkcją wartością zmiennej b będzie niezmiennie 2.

Zmienna c nie jest ani przekazywana do funkcji zasieg() jako argument, ani nie jest tworzona wewnątrz tej funkcji. Wartością początkową zmiennej c jest 3. Wewnątrz funkcji zasieg() ta zmienna jest nadal dostępna. W języku JavaScript zmienne, które nie są przekazane do funkcji jako argumenty, ani nie były utworzone wewnątrz funkcji słowem var, a istniały poza funkcją, automatycznie stają się wewnątrz funkcji zmiennymi globalnymi. Zmiany wartości zmiennej c, które zajdą wewnątrz funkcji, będą też widoczne poza tą funkcją. Obydwie instrukcje alert(a+’ ‘+b+’ ‘+c) wyświetlą tę samą wartość zmiennej c.

Jak poprawiać cudzy kod czyli co w skrypcie piszczy.

29 marca 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.