Pentru incepatori - cum scriem cod [puţină critică]

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Pentru incepatori - cum scriem cod [puţină critică]

Mesajde vectorialpx » Joi Sep 30, 2010 4:27 pm

Am vazut prin multe locuri greseli care se iau ca o ciuma, de la unul la altul. Stiu ca atunci cand esti la inceput e bine sa copiezi (si eu am facut asta) pentru ca inveti mai bine. O sa scriem aici (cine mai are alte exemple) ceea ce este bine sa copiezi de alti programatori si ce nu.
Critica e utila. Mie imi plac mai mult persoanele care ma critica decat cele care ma lauda.


1. Ce-a mai stupida chestie pe care am vazut-o si care probabil e preluata dintr-un alt limbaj de programare este concatenarea cu un string gol (probabil in ideea de a face cast string)

Cod: Selectaţi tot

<?php
$var1 
= $var2.'';
// este aproape acelasi lucru ca
$var1 = $var2;
// singura utilitate a unui cast ar fi utilizarea operatorului de identitate
// dar PHP stie sa faca singur cast in cazul unei anumite operatii
$var1 = '2';
$var3 = $var1+1; // asta este 3
// pentru ca se face cast functie de +.
// Daca in loc de +1 era .'1' atunci rezultatul era 21 pentru ca devenea string
?>



2. Diferenta dintre ghilimele simple si ghilimele duble

Cod: Selectaţi tot

 <?php
$ceva 
= 20;

// 1
$altceva = "alt$ceva"; // $altceva primeste valoarea alt20

// 2
$altceva = "alt$cevaaici"; // aici primeste valoarea alt
// + exista [uneori nu se afiseaza] un Notice cum ca $cevaaici nu exista

// 3
$altceva = "alt{$ceva}aici"; // aici primeste valoarea alt20aici

// 4
eval("echo $ceva+20;");
// este echivalent cu eval("echo 20+20;");
// pentru ca $ceva este luat drept 20 inainte ca eval sa se execute
// motiv pentru care:
eval("$var $ceva");
// nu va face NIMIC ci va da un notice cum ca $var nu exista
// apoi un Parse error, pentru ca tocmai am scris
//  = $ceva; // care este un cod incorect

// 5
$textculinienoua = 'string simplu'."\n".'iar asta e noua linie'.
'dar dupa \n de aici nu se intampla nimic'.
"decat daca \n este in duble, ca aici - de la este, se porneste o linie noua".'iar de la'."asta \t se porneste un tab";

// motiv pentru care nu este bine sa folosim continuu " daca nu avem nevoie,
// pentru ca pot aparea erori pe care le sesizam greu [codul fiind si mai putin lizibil] 

$parola = 'asd$asd%as'; // este OK
$parola = "asd$asd%as"; // nu este OK
// intelegeti voi de ce
?>



3. Incrementari inutile

Cod: Selectaţi tot

<?php
// am vazut la cineva ceva de genul asta:
$var[] .= 20;
// nu stiu ce a gandit omul, dar e ca si cum ai incerca sa adaugi 20 la o
// variabila (un array care are key = lastKey + 1) care tocmai a fost "facuta"
// si care este logic ca este goala.
// Din moment ce faci push, nu te intereseaza acel key, deci
// nici macar nu stii cum se numeste in totalitate acea variabila... si vrei sa-i adaugi ceva
?>



4. conditionari stupide

Cod: Selectaţi tot

<?php
// am vazut si o chestie de genul asta
if($var==0) { } else { /* ceva */ }
// si nici aici nu am inteles care-i faza...
// nu este incorect... repet: este corect din punct de vedere sintactic
// dar de ce sa lungesti codul inutil si, de ce sa nu scrii
if($var!=0) { /* ceva */ }
// PHP-ul stie sa conditioneze si chestii de genul
if( ($var1!=|| $var2==0) && ($var1%xor $var2==9) ) { /* ceva */ }
// deci nu e musai sa se 'loveasca' de niste acolade goale ca sa inteleaga care-i negatia
?>



5. <form action="<?=$_SERVER['REQUEST_URI'];?>" method="post" ...
sau <form action="<?=__FILE__?>" method="post" ...
De ce frate?! Cand
<form action="" method="post" ... este exact acelasi lucru


6. Folosirea lui <?=$var?> este OK doar daca server-ul are short-open-tags enabled. Altfel, se umple browser-ul de cod PHP


7.

Cod: Selectaţi tot

<?php
session_start
();
if(
$ceva){ /* do something */ } ?>
<?php include
('include/header.php'); ?>
<?php include
('include/box_dreapta.php');
?>

Este acelasi lucru cu 

Cod: Selectaţi tot

<?php
session_start
();
if(
$ceva){ /* do something */ }
include(
'include/header.php');
include(
'include/box_dreapta.php');
?>

Cu exceptia faptului ca nu-i zici PHP-ului
"acum fac output... stai, nu fac... ba da fac"


Sigur mai sunt maruntisuri d-astea. Adaugati si voi ce ati mai intalnit pe la altii.
Ultima oară modificat Mie Noi 09, 2011 3:41 pm de către vectorialpx, modificat de 2 ori în total.



Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Vin Oct 01, 2010 12:27 am

treaba cu tocanita de cod html completata pe ici pe colo cu cod php si chiar interogari sql... inteleg ca sunt incepatori dar e bine sa ganditi inainte sa scrieti codul nu dati copy paste si gata merge (asta daca vreti sa invatati ceva)

recomandarea e ca tot ce tine de php si mysql sa le faceti la inceputul pagini iar rezultatele ce urmeaza a fi afisate sa le bagati in variabile (de preferat de tip array ca sa nu aveti 70 de variabile si sa nu mai stiti ce nume au fiecare)

dupa ce ati terminat cu codul server side generati codul html al paginii si acolo unde trebuie puneti variabilele setate inainte folosind concaternarea ( ceva cod html ' . $variabila . ' alt cod html ' . $alta_variabila . ' etc)
si la sfarsit dati echo la tot...

e si mai usor de reparat daca aveti erori in el si mai rapid si mai citibil... (si eu faceam la inceput asa deoarece asa gaseam in tutoriale, pana am invatat ca e mai bine altfel)
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

migrosoft
New Member
Mesaje: 1
Membru din: Joi Sep 01, 2011 3:23 pm

Nice forum

Mesajde migrosoft » Joi Sep 01, 2011 6:17 pm

Imi plac discutiile de pe acest forum, sunt foarte instructive! :idea:

expertphp
PHPRomania Supporter
Mesaje: 15
Membru din: Sâm Oct 02, 2004 12:00 am
Localitate: Constanta
Contact:

Mesajde expertphp » Sâm Oct 29, 2011 9:36 pm

Daca tot ai scris ca preferi sa te critice cineva, sa incerc eu primul (glumesc...) :D Totusi, ca sa nu las acest dialog neterminat, am o mica precizare referitor la ce ai scris:

Cod: Selectaţi tot

<?php
$var1 = $var2.'';
// este exact acelasi lucru ca
$var1 = $var2; // repet: este inutila concatenarea cu ''
?>

Nu prea e acelasi lucru daca luam in considerare $var2 ca nefiind string ;) Comparatia de numai si numai (triplu egal: ===) nu mai este valabila. Exemplu:

Cod: Selectaţi tot

<?php
$var2 = 1; // integer
$var1 = $var2.''; // string
if ($var1 === $var2) // boolean false
?>

Sau referitor la:

Cod: Selectaţi tot

<?php
// am vazut si o chestie de genul asta
if($var==0) { } else { /* ceva */ }
// si nici aici nu am inteles care-i faza...
// nu este incorect... repet: este corect din punct de vedere sintactic
// dar de ce sa lungesti codul inutil si, de ce sa nu scrii
if($var!=0) { /* ceva */ }
?>

In cazul acesta cand ai de a face cu 0 (zero) ca numar, se poate scurta codul la doar:

Cod: Selectaţi tot

<?php if (!$var) { /* ceva */ }  ?>

Codul html:
5. <form action="<?=$_SERVER['REQUEST_URI'];?>" method="post" ...
sau <form action="<?=__FILE__?>" method="post" ...
De ce frate?! Cand
<form action="" method="post" ... este exact acelasi lucru

Defapt action la form e sa definesti alta pagina, daca nu scrii deloc, browser-ul trebuie sa faca autocomplete cu pagina curenta, iar daca e mothod de tip get, aceasta la randul ei poate fii optionala.
<form action="" method="post">
este acelasi lucru cu:
<form method="post">


<form method="get">
este acelasi lucru cu:
<form>

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Mesajde vectorialpx » Dum Oct 30, 2011 7:09 pm

expertphp scrie:

Cod: Selectaţi tot

<?php
$var1 = $var2.'';
// este exact acelasi lucru ca
$var1 = $var2; // repet: este inutila concatenarea cu ''
?>
Nu prea e acelasi lucru daca luam in considerare $var2 ca nefiind string ;) Comparatia de numai si numai (triplu egal: ===) nu mai este valabila.
Nu conteaza daca este string sau nu. Daca il folosesti intr-un context de string, se va face singur string (in cazul unei concatenari). Daca vrei sa faci o adunare, va deveni numeric. Daca vrei sa faci o comparatie ca si identitate, asa cum zici tu, poti face un cast
$var1 = (string)$var2;


expertphp scrie:Defapt action la form e sa definesti alta pagina, daca nu scrii deloc, browser-ul trebuie sa faca autocomplete cu pagina curenta, iar daca e mothod de tip get, aceasta la randul ei poate fii optionala.
<form action="" method="post">
este acelasi lucru cu:
<form method="post">

<form method="get">
este acelasi lucru cu:
<form>
Da, dar ceea ce ai scris tu este invalid din punct de vedere w3c. Adica, atat action cat si method sunt required

expertphp
PHPRomania Supporter
Mesaje: 15
Membru din: Sâm Oct 02, 2004 12:00 am
Localitate: Constanta
Contact:

Mesajde expertphp » Mar Noi 08, 2011 11:18 pm

Nu conteaza daca este string sau nu. Daca il folosesti intr-un context de string, se va face singur string (in cazul unei concatenari). Daca vrei sa faci o adunare, va deveni numeric. Daca vrei sa faci o comparatie ca si identitate, asa cum zici tu, poti face un cast
$var1 = (string)$var2;
Pai, initial ai scris ca este acelasi lucru, ceea ce nu e ;) adica: $var1 = $var2; (< gresit) , la o comparatie de triplu egal ai false.
Da, dar ceea ce ai scris tu este invalid din punct de vedere w3c. Adica, atat action cat si method sunt required
Oke, aici ai perfecta dreptate, dar nu mai credeam ca exista dinozauri care codeaza, mai incearca ceva din epoca in care traim, gen HTML5 :D (aka <script src> sau <meta charset>), iar in cazul javascript chiar nu conteaza cand formezi noduri, de exemplu <form>.

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Mesajde vectorialpx » Mie Noi 09, 2011 3:38 pm

expertphp scrie:Pai, initial ai scris ca este acelasi lucru, ceea ce nu e ;) adica: $var1 = $var2; (< gresit) , la o comparatie de triplu egal ai false.
Da, ai dreptate... nu e exact acelasi lucru dar majoritatea celor care folosesc chestia asta o fac din inertie, fiind incepatori (target-ul thread-ului + nu prea folosesc operatorul de identitate).

Varianta normala de cast este

Cod: Selectaţi tot

$var1 = (string)$var2;


Nu prea vad o situatie in care sa faci cast la string pentru a folosi apoi identitatea. De obicei se folosesc cast-urile la INT pentru a verifica valori numerice... dar, good point, o sa fac un edit.

Avatar utilizator
socu
Senior Member
Mesaje: 470
Membru din: Mie Apr 22, 2009 11:05 pm
Localitate: Marghita

Re: Pentru incepatori - cum scriem cod [puţină critică]

Mesajde socu » Vin Ian 25, 2013 7:09 pm

Acea concatenare sau un cast la string are rost la obiecte.

Cod: Selectaţi tot

<?php
      class x {
        function __toString() {
          return 'surpriza';
        }
      }
     
      $a = new x();
      $b = $a . '';
      var_dump($b);
   ?>


Ce vad cel mai des si e enervant:

Cod: Selectaţi tot

$a = 2;
$b = "$a" * 5; // !!!


LE: din cauza noului design, acum vad ca e de demult postul.

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4832
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Re: Pentru incepatori - cum scriem cod [puţină critică]

Mesajde vectorialpx » Vin Ian 25, 2013 9:14 pm

socu scrie:Acea concatenare sau un cast la string are rost la obiecte.

Oh nu... nu asta e modul in care se foloseste concatenarea cu un string gol, crede-ma :)
E ceva de genul (de curand nu prea am mai vazut, ceea ce-i bine):

Cod: Selectaţi tot

<?php
$a = 'ceva';
echo ''.$a;
?>


socu scrie:Ce vad cel mai des si e enervant:

Cod: Selectaţi tot

$a = 2;
$b = "$a" * 5; // !!!
Da, am vazut si eu si nu inteleg care-i ideea (adica, la ce se gandeste lumea).
Chestii de genul $a = "$b"; 8O

socu scrie:LE: din cauza noului design, acum vad ca e de demult postul.
Nu-i bai, e bine sa adaugi aici oricand. D-asta e sticky. :)

LE: S-a discutat mult aiurea. Am sters mesajele care nu aveau legatura (despre care cum cand face cast) pentru a pastra acest topic curat.
Va rog sa postam/postati greseli pe care le-ati vazut la incepatori sa pe care le-ati facut in trecut + varianta corecta.


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 41 vizitatori