php – functii cu numar variabil de parametri

Pe langa faptul ca parametrii unei functii php pot avea valori predefinite, precum in exemplul urmator :

<?php
    function say( $what = "nothing" )
    {
        echo $what . "\n";
    }
   
    say( "dude" );
    say( );
?>

mai exista posibilitatea de a defini si functii cu numar variabil de parametri in felul urmator:

<?php
    function say( )
    {
        for ( $i = 0; $i < func_num_args(); $i++ )
            echo func_get_arg( $i ) . " ";
        echo "\n";
    }

    say( "test", "another test" );
?>

In cazul cand se alege aceasta modalitate de a pasa parametrii, accesul la parametri se face cu ajutorul functiilor:

Asta inseamna ca putem defini o functie ce poate lua un numar de parametri intr-un caz si alt numar de parametri in alt caz.

Un exemplu practic unde se poate folosi acest feature al php-ului este la definirea functiilor de SET / GET in clase pentru accesul la anumite date private din clasa respectiva. O functie de SET este o functie ce seteaza o valoare privata in clasa, iar o functie de GET este una care ia valoarea unui membru privat din clasa. Se observa ca functia de set trebuie sa ia cel putin un parametru – fiind noua valoare a membrului

    ///set new value
    public function setValue( $newvalue );

iar functia de GET nu ia nici un parametru, dar trebuie sa returneze valoarea ceruta :

    ///get value
    public function getValue( );

la prima vedere aceste functii pot trai si separat si independente, dar exista posibilitatea sa le comansam in una singura cu ajutorul functiilor cu numar variabil de parametri.
Exemplu:

<?php
    /// definesc clasa A
    class A {
        /// membru privat $_id
        private $_id = 0;
       
        /// functie get/set cu numar variabil de parametri
        public function id( ) {
            if ( func_num_args( ) == 0 ) {
                //daca nu este pasat nici un parametru
                //se returneaza valoarea $_id
                return $this->_id;
            } else {
                //altfel, setez $_id cu primu parametru
                //(restul parametrilor se ignora)
                $this->_id = func_get_arg( 0 );
                return TRUE;
            }
        }
    }
   
    //creez o instanta a clasei A
    $a = new A();
   
    //apelez functia id() ca SET
    $a->id( 5 );
   
    //apelez functia id() ca GET
    echo $a->id();
?>

Prin aceasta modalitate, vom defini in clasa doar o singura functie ceea ce va scadea numarul functiilor declarate in clasa si va face clasa mai usor utilizabila.

atat.

c++ printf %s

programez de mult (parca) in C/C++, si uite chiar si asa este loc de a invata ceva nou.

Problema care mi-a aparut era ceva de genu : cum printez un substring ( primele N caractere dintr-un string ) fara a fi nevoit sa creez un alt string ( nu am posibilitatea de a modifica stringul initial ).  Rezolvarea acestei dileme are un raspuns foarte usor si foarte foarte foarte elegant.

Idea este in specificatorii de format al functiei printf().Pentru a afisa un string se foloseste specificatorul %s :

char buff[] = "Hello, world";
printf( "%s\n", buff );

Pe langa acest specificator, mai exista nishte parametri, care, fiind neprezenti, sunt pe default, iar sintaxa completa a specificatorului ar fi astfel :

%[PAD][.LEN]s

PAD & LEN sunt numere naturale. Atunci cand este specificat PAD, se incearca afisarea stringului in “PAD” caractere aliniat la dreapta, astfel daca PAD este mai mic decat numarul de caractere din string se afiseaza stringul, iar daca este mai mare – afiseaza stringul aliniat la dreapta si in stanga este umplut spatiu cu spatii.

Atunci cand este specificat LEN, se afiseaza doar LEN caractere din string ( lucru ce se intimpla doar la afisarea de stringuri ).

Exemplu:

printf( "%5.5s \n", buff );

atunci cand se vrea specificarea acestor parametri in timpul rularii programului ( sa nu fie hardcod-ati in printf ), se pune in locul lor ‘*’ si se mai adauga valoarea lui in lista de parametri, astfel :

printf( "%*s\n", 5, buff ); //este egal cu "%5s\n"

Si programul de test :

#include <stdio.h>

int main()
{
	char buff[] = "Hello, world!";
	int pad = 20;
	int len = 10;

	printf( "%s\n", buff );
	printf( "\n" );
	printf( "%20s\n", buff );
	printf( "%.10s\n", buff );
	printf( "%20.10s\n", buff );
	printf( "\n" );
	printf( "%*s\n", 20, buff );
	printf( "%.*s\n", 10, buff );
	printf( "%*.*s\n", 20, 10, buff );
	printf( "\n" );
	printf( "%*s\n", pad, buff );
	printf( "%.*s\n", len, buff );
	printf( "%*.*s\n", pad, len, buff );

	return 0;
}

cu outputul :

Hello, world!

       Hello, world!
Hello, wor
          Hello, wor

       Hello, world!
Hello, wor
          Hello, wor

       Hello, world!
Hello, wor
          Hello, wor

atat.

Interacţiunea PHP-MySQL

MySQL – utilizează la realizarea interogărilor standartul SQL (Server Query Language) cu anumite mici modificări. Pentru interactiunea PHP-MySQL sunt utilizate mai multe funcţii. Majoritatea funţiilor returnează un array sau un număr, care reprezintă datele referitor la numărul de coloane, tabele, inregistrări etc. Sau reprezintă un array cu inregistrările dintr-o tabelă sau mai multe tabele, sau numele coloanelor, tabelelor etc.
Pentru a putea realiza cererile MySQL este necesar să stabilim o legatură cu serverul MySQL. Pentru a stabili această legatură trebuie specificaţi 4 parametri strict necesari şi unul secundar :

1. Numele hostului unde este stocată baza de date MySQL.
2. Numele utilizatorului.
3. Parola
4. Numele Bazei de Date necesare.
5. Time zone (secundar)

Interacţiunea PHP-MySQL ar fi bine să o realizăm într-o clasă. Asta ne va permite implementarea interacţiunii PHP-MySQL oriunde unde vom avea nevoie de ea.
În baza acestor 5 parametri se stabileşte legatura cu serverul. Această legatură cu serverul ar fi bine să o realizăm în constructorul clasei. Asta ne va asigura că la utilizarea instanţelor de tip clasă, va fi realizată legatura cu serverul. Aceşti 5 parametri DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_TIME vor fi definiţi ca constante în fişierul de config.
Continue reading Interacţiunea PHP-MySQL

[php] Cum să faci un site în php de la zero

Dacă va-ţi pus acestă intrebare vreodată presupun că sunteţi cunoscuţi cît de cît cu HTML-ul. Asta ar înseamna că stiţi principiul de funcţionare a unei pagini sau cel puţin înţelegeţi cum are loc navigarea dintr-o pagină în alta.
În mod obişnuit, de exemplu, eu primele pagini web scrise in php le organizam în modul urmator (se bazau pe acelaşi principiu ca în HTML-ul pur).
ex:

<html>
    <head>
        <title>Home Page</title>
    </head>
    <body>
        home |
        <a href="services.php">Services</a> |
        <a href="about.php">About</a>
       
        More about this site, about services and lorem ipsus.
       
        <?php
        // partea dinamica
        // adica cea ce tine de php
        .....
        ?>
       
    </body>
</html>
<html>
    <head>
        <title>Services Page</title>
    </head>
   
    <body>
        <a href="home.php">home</a> |
        Services |
        <a href="about.php">About</a>
       
        <?php
        print "Service 1";
        //.....
        ?>
       
        <?php
        print "Service 2";
        //.....
        ?>
       
        .........
       
    </body>
</html>

etc.

Însă aşa o organizare este de multe ori incomodă pentru un site mai dinamic. De exemplu, dacă trebuie de modificat sau de adaugat un link atunci va trebui să modificăm toate paginile.

Continue reading [php] Cum să faci un site în php de la zero

[php] & macros

venind din mediul de programare C / C++, am inceput sa caut prin php asemanari in legatura cu variabilele / constantele / macrourile foarte utile : __FILE__ , __LINE__ . In C, ele sunt numite macrouri, pentru ca la momentul compilarii se inlocuieste continutul acestor macrouri cu informatii shtiute la compilare doar, apoi in timpul executiei programului ele apar deja ca constante. Se pare ca dezvoltatorii php au vrut sa faca viata mai placuta celora care trec la php… si acestor macrouri le-au zis pur si simplu : “magic constants“, pentru ca macrouri nu pot fi numite datorita faptului ca php e un limbaj de scripting.

Si un exemplu de utilizare a acestor “macrouri” :

1 <?php
2     $fin = @fopen( 'file.txt', 'r' );
3     if ( ! $fin ) {
4         echo "Error opening file for read ";
5         echo __FILE__ . " : " . __LINE__;
6     }
7 ?>

a carui output este :

Error opening file for read @ /media/data1/WEB/index.php : 5

end.

[linux] generate core dump

Kernelul de linux este capabil de a scri asa numitele “core dump” in caz ca vreo aplicatie “crapa”. Acest dump contine informatii despre starea procesului in momentul cand a crapat. GDB poate citi astfel de dump-uri de core si a scoate informatii utile din el.

Majoritatea distributiilor de linux au aceasta facilitate dezactivata, pentru acestea este nevoie de a activa-o, astfel:

root@srv1:~# ulimit -c unlimited

aceasta comanda va activa crearea de dumpuri pentru shell-ul curent si toate procesele pornite din el. Data viitoare cand va crapa vreo aplicatie, mesajul “Segmentation fault” va fi modificat in “Segmentation fault (core dumped)” si in directoriul curent va fi creat un fisier “core” sau “core.pid” (fisier care si reprezinta core dump-ul).

Dupa ce este generat un fisier core, cu ajutoru gdb-ului se poate afla ce s-a intimplat in aplicatie. GDB se apeleaza :
gdb nume_executabil [core-file]
Cele mai bune informatii puteti sa le scoateti din stacktrace ( lista de functii in care s-a intrat pana la momentul crash-ului ) si deseori aceasta fiind indeajuns de a afla ce nu merge bine. Stacktrace-ul in gdb se afiseaza cu comanda : “bt“.
end.