Տարբերանշան

**PHP**-ն (անգլ.՝ PHP: Hypertext Preprocessor, «PHP՝ Հիպերտեքստային Պրեպրոցեսսոր») ընդհանուր նշանակության սկրիպտային ծրագրավորման լեզու է, որն ինտենսիվորեն օգտագործվում է վեբ ծրագրավորման մեջ։ Ներկայումս այն աջակցվում է հոսթինգ տրամադրող ընկերությունների ճնշող մեծամասնության կողմից և հանդիսանում է առաջատար ծրագրավորման լեզուներից մեկը, որոնք կիրառվում են դինամիկ վեբ-կայքերի ստեղծման համար։

Լեզուն և իր ինտերպրետատորը մշակվում են մի խումբ էնտուզիաստների կողմից բաց կոդով նախագծի շրջանակներում։ Նախագիծը տարածվում է սեփական արտոնագրով, որն անհամատեղելի է GNU GPL-ի հետ։

Կիրառման ոլորտներ
-----------------

Լեզվի պարզության, կատարման արագության, հարուստ ֆունկցիոնալության, բազմահարթակ լինելու և PHP արտոնագրով ընթացիկ կոդերի տարածման շնորհիվ, այսօր վեբ-ծրագրավորման ոլորտում PHP-ն աշխարհի ամենահայտնի սկրիպտային ծրագրավորման լեզուներից մեկն է (JSP-ի, Perl-ի և ASP.NET-ում օգտագործվող լեզուների հետ միասին)։

Վեբ-կայքերի կառուցման ոլորտում ճանաչված լինելը պայմանավորված է վեբ-հավելվածների ստեղծման համար նախատեսված բազմաթիվ ներկառուցված միջոցների առկայությամբ։ Դրանցից հիմնականներն են՝

* POST և GET պարամետրերի, ինչպես նաև վեբ-սերվերի փոփոխականների ինքնուրույն տարանջատումը նախապես որոշված հատուկ զանգվածներում,
* բազմաթիվ տվյալների բազաների կառավարման համակարգերի հետ փոխազդեցությունը (MySQL, MySQLi, SQLite, PostgreSQL, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Cloudscape և Apache Derby, Informix, Ovrimos SQL, Lotus Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird / InterBase, Paradox File Access, MaxDB, PDO միջերես),
* HTTP-գլխագրերի ավտոմատացված ուղարկումը,
* HTTP-լիազորագրերի հետ աշխատելու ունակությունը,
* cookies-ի և սեսիաների հետ աշխատելու ունակությունը,
* տեղային և հեռացված ֆայլերիերի, socket-ների հետ աշխատելու ունակությունը,
* վեբ-սերվեր վերբեռնված ֆայլերի մշակումը,
* XForms-ի հետ աշխատելու ունակությունը։

Ներկայումս հարյուր հազարավոր ծրագրավորողներ օգտվում են PHP-ից։ TIOBE կորպորացիայի՝ որոնողական համակարգերի տվյալների վրա հիմնված վարկանշային աղյուսակի համաձայն, 2013 թվականի հունիսի դրությամբ, ծրագրավորման լեզուների շարքում PHP-ն զբաղեցնում է 5-րդ հորիզոնականում։ PHP օգտագործում են նաև բազմաթիվ հանրահայտ ընկերություններ, ինչպիսիք են Ֆեյսբուքը, ՎԿ-ն և Վիքիպեդիան։

Պատմություն
-----------

1994 թ. Դանիացի ծրագրավորող Ռասմուս Լերդորֆը ստեղծեց Perl/CGI սկրիպտերի ընտրանի, որը պետք է հաշվեր և արտարծեր իր համացանցում տեղադրված ռեզյումեի այցելուների քանակը՝ մշակելով HTML-փաստաթղթերի նմուշները։ Լերդորֆը այդ ընտրանին անվանեց *Personal Home Page* (*Անձնական Տնային Էջ*)։ Շուտով Perl-ի ինտերպրետատորի ունակություններն ու արագությունը սկսեց չբավարարել, և Լերդորֆը C ծրագրավորման լեզվի օգնությամբ մշակեց նոր նմուշների ինտերպրետատոր՝ *PHP/FI* (անգլ.՝ Personal Home Page / Forms Interpreter - «Անձնական Տնային Էջ / Ֆորմաների ինտերպրետատոր») անվանումով։

1997-ին, երկարատև բետա-փորձարկումներից հետո վերջապես թողարկվեց C-ով գրված մշակչի երկրորդ տարբերակը՝ PHP/FI 2.0-ն։ Այն օգտագործում էին ամբողջ աշխարհի բոլոր դոմենների շուրջ 1%-ը։

PHP 3.0 տարբերակը ենթարկվեց նշանակալի վերամշակման, որն սահմանեց ծրագրավորման լեզվի ժամանակակից տեսքն ու ոճը։ 1997 թվականին երկու իսրայելացի ծրագրավորողներ՝ Էնդի Գութմանսը և Զեև Սուրավսկին, ինտերպրետատորի ամբողջ կոդն գրեցին նորից։ PHP 3.0-ն պաշտոնապես թողարկվեց 1998-ի հունիսին։

PHP 3.0-ի ուժեղ կողմերից մեկն այն էր, որ հնարավոր էր միջուկն ընդլայնել լրացուցիչ մոդուլների հաշվին։ Դրա հետևանքով ընդլայնումների գրառման մեջերեսը իրենց սեփական մոդուլները գրող բազմաթիվ ծրագրավորողների ուշադրությունը հրավիրեց PHP-ի կողմը, ինչը PHP-ին հնարավորություն տվեց աշխատել բազմաթիվ տվյալների բազաների, կանխագրերի (անգլ.՝ Protocol-ների) հետ, ապահովել բազմաթիվ API-ներ։ Ծրագրավորողների մեծ թիվը բերեց լեզվի արագ զարգացման։ Այս տարբերակից սկսած հապավումը կարդացվում է իբրև «PHP: Hypertext Preprocessor»։

1998 թ. ձմռանը, PHP 3.0-ի թողարկումից անմիջապես հետո, Էնդի Գութմանսն ու Զեև Սուրավսկին սկսում են PHP-ի միջուկի վերամշակումը։ Անհրաժեշտ էր մեծացնել բարդ հավելումների կատարողականությունը։ Նոր շարժիչը, որն անվանվեց Zend Engine, կարողացավ հաղթահարել իրեն առաջադրված խնդիրները և առաջին անգամ ներկայացվեց 1999-ին։ PHP 4.0-ն, որն հիմնված էր այդ շարժիչի վրա, իր հետ բերեց լրացուցիչ ֆունկցիաների մի ամբողջ հավաքածու և պաշտոնապես թողարկվեց 2000 թվականի մայիսին։ Որպես կատարողականության մեծացմանը լրացում, PHP 4.0-ն ուներ նաև այլ նորամուծություններ, որոնցից էին սեսսիաները, արտարծման բուֆերացումը, օգտագործողի կողմից ներմուծած ինֆորմացիայի առավել անվտանգ մշակման գործիքներ և մի քանի նոր լեզվային կառույցներ։

PHP-ի հինգերորդ տարբերակը մշակողների կողմից թողարկվեց 2004 թ. հունիսի 13-ին։ Փոփոխությունները ներառում էին Zend-ի միջուկի թարմացումը (Zend Engine 2), որն էապես մեծացրեց ինտերպրետատորի արդյունավետությունը։ Ներառվեց XML նշագրման լեզվի աջակցությունը։ Ամբողջությամբ վերամշակված էին OOP-ի բոլոր ֆունկցիաները, որոնք այժմ որոշ դեպքերում նման էին Java-ի կողմից օգտագործվող մոդելին։ Մտցված էր Descructor-ը, բաց, փակ ու պաշտպանված մեթոդներն ու հատկությունները, օբյեկտենի մեջերեսն ու կլոնավորումը։ Արդեն ավելի նոր տարբերակնում ավելացվել են նաև անվանատարածքները և մի ամբողջ շարք կարևոր փոփոխություններ, որոնք քանակապես և որակապես տարբերվում էին PHP 5.0-ում տեղ գտած փոփոխություններից։

PHP-ի վեցերորդ տարբերակի մշակումը սկսվել է 2006-ի հոկտեմբերից, սակայն 2010-ի մարտին PHP6-ի մշակումը համարվեց անհեռանկարային և դադարեցվեց։ Այժմ մշակման հիմնական ուղղություն է համարվում PHP 5.4-ի մշակումը։

### Թողարկման պատմություն

|  | Նշանակումը |
| --- | --- |
| Կարմիր | Թողարկումն այլևս չի աջակցվում |
| Կանաչ | Թողարկումն աջակցվում է |
| Կապույտ | Դեռ չի թողարկվել |

| Հիմնական տարբերակ | Երկրորդական տարբերակ | Ամսաթիվը | Նշումներ |
| --- | --- | --- | --- |
| 1 | 1.0.0 | Հունիսի 8, 1995 թ․ | Պաշտոնապես անվանվել է «Անձնական տվային էջի գործիքներ» (անգլ.՝ Personal Home Page Tools, (PHP Tools))։ Սա PHP անվանման առաջին կիրառությունն է |
| 2 | 2.0.0 | Նոյեմբերի 1, 1997 թ․ | Մշակողի խոսքերով, այս տարբերակը «ամենաարագ և պարզ գործիքն է» դինամիկ վեբ-էջեր ստեղծելու համար |
| 3 | 3.0.0 | Հունիսի 6, 1998 թ․ | Մշակումն անցնում է մշակողների մի ամբողջ խմբի ձեռքը։ Էնդի Գութմանսը և Զեև Սուրավսկին գրում են ինտերպրետատորի ամբողջ կոդն գրում են նորից։ |
| 3.0.18 | Հոկտեմբերի 20, 2000 թ․ | PHP 3.0.x-ի վերջին տարբերակը Unsupported Historical Releases |
| 4 | 4.0.0 | Մայիսի 22, 2000 թ․ | Ավելացվել է առավել առաջադեմ, երկփուլանի վերլուծող Zend Engine համակարգը։ |
| 4.1.0 | Դեկտեմբերի 10, 2001 թ․ | Ներկայացվեց սուպերգլոբալ զանգվածները ($\_GET-ը, $\_POST-ը, $\_SESSION-ը և այլն) |
| 4.2.0 | Ապրիլի 22, 2002 թ․ | register\_globals-ը լռելյան անջատված է։ |
| 4.3.0 | Դեկտեմբերի 27, 2002 թ․ | Ներկայացվեց հրամանի տողի միջերեսը (CLI), որը պետք է լրացներ CGI-ն։ |
| 4.4.0 | Հուլիսի 11, 2005 թ․ | Ավելացված է էջեր phpize և php-config սկրիպտերի համար։ |
| 4.4.9 | Օգոստոսի 7, 2008 թ․ | Անվտանգության բարելավում և սխալների ուղղում։ PHP 4.4-ի վերջին թողարկումը։ |
| 5 | 5.0.0 | Հուլիսի 13, 2004 թ․ | Zend Engine II-ը նոր օբյեկտային մոդելով։ |
| 5.1.0 | Նոյեմբերի 24, 2005 թ․ | Արտադրողականության բարելավում՝ ի շնորհիվ վերակառուցված PHP Engine―ի նոր կոմպիլյատորի փոփոխականների։ |
| 5.2.0 | Նոյեմբերի 2, 2006 թ․ | Ֆիլտրերի ընդլայնումները լռելյան միացված են։ Մտցված է JSON-ի աջակցումը։ |
| 5.2.16 | Դեկտեմբերի 16, 2010 թ․ | PHP 5.2-ի վերջին թողարկումը։ |
| 5.2.17 | Հունվարի 6, 2011 թ․ | Ուղղված է լողացող կետի հետ կապված կրիտիկական խոցելիությունը։ |
| 5.3.0 | Հունիսի 30, 2009 թ․ | Անվանատարածքների, անցնելու պիտակների (սահմանափակ goto), բնածին PHP արխիվների (phar) աջակցում, Windows ՕՀ-ի բարելավված աջակցում, sqlite3-ի աջակցում, libmysql-ի փոխարինումը mysqlnd-ով, mime\_magic-ի փոխարինումը fileinfo-ով (MIME-ի ավելի լավ աջակցման համար), ինտերնացիոնալիզացման ընդլայնում։ ereg ընդլայնումն ճանաչվում է որպես հնացած։ |
| 5.3.1 | Նոյեմբերի 19, 2009 թ․ | Ավելի քան 100 սխալների ուղղում, որոնցից շատերը կապված են անվտանգության հետ։ |
| 5.3.2 | Ապրիլի 4, 2010 թ․ | Ներառում է մեծ թվով սխալների ուղղում։ |
| 5.3.3 | Հուլիսի 22, 2010 թ․ | Հիմնականում սխալների ուղղում։ FPM SAPI-ի աջակցում |
| 5.3.4 | Դեկտեմբերի 10, 2010 թ․ | Հիմնականում սխալների ուղղում։ FPM SAPI-ի բարելավվում |
| 5.3.5 | Հունվարի 6, 2011 թ․ | Ուղղված է լողացող կետի հետ կապված կրիտիկական խոցելիությունը։ |
| 5.3.6 | Ապրիլի 10, 2011 թ․ | Ավելի քան 60 սխալների ուղղում, որոնց մասին զեկույցները ստացվել էին նախորդ տարբերակներից։ |
| 5.3.7 | Օգոստոսի 18, 2011 թ․ | Այս թողարկումը կենտրոնացված է PHP 5.3.x-ի կայունության բարելավվմանը, ինչի համար ուղղվել են անվտանգության հետ կապված ավելի քանի 90 սխալ։ |
| 5.3.8 | Օգոստոսի 23, 2011 թ․ | Ուղղվել են PHP 5.3.7-ում տեղ գտած երկու սխալ։ |
| 5.3.9 | Հունվարի 10, 2012 թ․ | Այս թողարկումը կենտրոնացված է PHP 5.3.x-ի կայունության բարելավվմանը, ինչի համար ուղղվել են անվտանգության հետ կապված ավելի քանի 90 սխալ։ |
| 5.3.10 | Փետրվարի 2, 2012 թ․ | Ուղղվել է Սթեֆան Էսսերի կողմից զեկուցված սխալը, որի միջոցով հնարավոր էր լինում կատարել ցանկացած կոդ։ |
| 5.3.13 | Մայիսի 8, 2012 թ․ | Ուղղվել է CGI-ի վրա հիմնված կարգավորումների խոցելիությունը։ |
| 5.3.14 | Հունիսի 6, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.3.15 | Հուլիսի 19, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.3.16 | Օգոստոսի 16, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.4.0 | Մարտի 1, 2012 թ․ | Trait-ների աջակցում, զանգվածների կարճ գրառման ձև։ Հեռացվել են մի շարք դիրեկտիվներ և ֆունկցիաներ՝ `register_globals`, `safe_mode`, `allow_call_time_pass_reference`, `session_register()`, `session_unregister()` և `session_is_registered()`։ Ավելացվել է ներկառուցված վեբ-սերբեր։ Գոյություն ունեցող ֆունկցիաների, արտադրողականության որոշակի բարելավվում, աշխատանքի համար անհրաժեշտ հիշողության իջեցում։ |
| 5.4.1 | Ապրիլի 26, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.4.2 | Մայիսի 3, 2012 թ․ | PHP-CGI հարցման տողի պարամետրի հետ կապված խոցելիության ուղղում։ |
| 5.4.3 | Մայիսի 8, 2012 թ․ | Ուղղվել են CGI-ի վրա հիմնված կարգավորումներիմ, ինչպես նաև apache\_request\_headers()-ի հետ կապված խոցելիությունները |
| 5.4.4 | Հունիսի 6, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.4.5 | Հուլիսի 19, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 5.4.6 | Օգոստոսի 16, 2012 թ․ | Ուղղվել են բազմաթիվ սխալներ։ |
| 6 | 6.0.0 | Առանց ամսաթվի | PHP 6-ի մշակումը դադարեցված է, քանի որ մշակողներն եկան այն եզրահանգմանը, որ Յունիկոդի աջակցումն ապահովելու համար ամբողջ միջուկը վերագրելը այնքան էլ ճիշտ մոտեցում չէ, և որոշեցին գտնել հարցի լուծման այլ ուղիներ։ Թարմացումները, որոնք պետք է տեղ գտնեին PHP 6-ում, ավելացվել են PHP 5.3.0-ում (namespace աջակցում, lambda ֆունկցիաներ, goto) և 5.4.0-ում (trait-ներ)։ |

Շարահյուսություն
----------------

PHP-ի շարահյուսությունը նման է C լեզվի շարահյութությանը։ Որոշ տարրեր, ինչպիսիք են ասոցիացվող զանգվածները  և foreach ցիկլը, վերցված են Perl-ից։

Ծրագրում փոփոխականներ օգտագործելուց առաջ դրանք նախապես հայտարարելու կարիք չկա։ Ցանկացած ծրագիր կարող է սկսվել PHP-ի օպերատորից։

PHP-ով գրված Hello, world! ծրագիրն ունի հետևյալ տեսքը՝

```
<?php
  echo 'Hello, world!';
?>

```

PHP-ն կատարում է միայն այն կոդը, որը `<?php ?>`-ի սահմաններում է։ Այն ամենը, ինչն այդ սահմաններից դուրս է գտնվում, արտարծվում է առանց փոփոխության։ Հիմնականում դա օգտագործվում է HTML փաստաթղթում PHP կոդի տեղադրման համար։ Օրինակ՝

```
<html>
 <head>
  <title>Փորձարկում ենք PHP-ն</title>
 </head>
 <body>
  <?php echo 'Hello, world!'; ?>
 </body>
</html>

```

Բացի `<?php ?>` սահմանիչներից, կարելի է օգտագործել նաև `<? ?>` և `<script language="php"> </script>` սահմանիչները, իսկ մինչև 6.0 տարբերակը, թույլատրվում է օգտագործել նաև ASP-ի սահմանիչները՝ `<% %>` (`<? ?>` և `<% %>` սահմանիչների աջակցությունը, ցանկության դեպքում, կարելի է անջատել ինտերպրետատորի php.ini ֆայլի միջոցով, եթե ինտերպրետատորի տարբերակը 5.3 և ավելի փոքր է)։

Փոփոխականների անվանումները սկսվում են $ նշանով։ Փոփոխականի տեսակը հրապարակել պետք չէ։ Փոփոխականների, ֆունկցիաների, հաստատունների և դասերի անվանումներում մեծատառերն ու փոքրատառերը հաշվի են առնվում։ Փոփոխականները գործում են տողեում, որոնք `" "` չակերտների մեջ են առնված, ինչպես նաև Heredoc տողերում (այն տողերում, որոնք ստեղծվում են «< նշանի միջոցով)։

PHP-ն աջակցում է 3 տեսակի մեկնաբանություն՝ C-ի ոճով (բազմատողանի մեկնաբանություններ՝ սահմանափակված `/*`-ով և `*/`-ով), C++ ծրագրավորմկան լեզվի ոճով (միատողանի մեկնաբանություններ, որոնք սկսում են `//`-ով և ավարտվում ենք տողը վերջանալով) և Unix-ի ոճով (միատողանի մեկնաբանություններ, որոնք սկսում են `#`-ով և ավարտվում ենք տողը վերջանալով)։

PHP-ում հրահանգները բաժանվում են կետ-ստորակետներով (;)։ Այն դրվում է բոլորի հրահանգներից հետո, բացառությամբ որոշ դեպքերի՝ if/else կառույցների և ցիկլերի գրառումներից հետ, ինչպես նաև դրանց և դասերի / միջերեսների հրապարակումից հետո դրվող ձևավոր փակագծերից (`{` և `}`)։ Օրինակ՝

```
// Դասից հետո դրվող ձևավոր փակագծերից հետո
class myClass {
    /\* Դասի պարունակությունը \*/
} // Այստեղ կետ-ստորակետ չի դրվում

// Պայմանից հետո
if( $a === true ) // Այստեղ կետ-ստորակետ չի դրվում
    var\_dump($a);

// Պայմանից հետո դրվող ձևավոր փակագծերից հետո
if( $a === true ) {
    var\_dump($a);
} // Այստեղ կետ-ստորակետ չի դրվում

// Ցիկլից հետո
for( $i=0; $i <= 10; ++ $i ) // Այստեղ կետ-ստորակետ չի դրվում
    echo $i;

while( $i <= 10 ) // Այստեղ կետ-ստորակետ չի դրվում
    echo $i++;

foreach( $array as $key => $value ) // Այստեղ կետ-ստորակետ չի դրվում
    echo "$key => $value \n";

// Ցիկլից հետո դրվող ձևավոր փակագծերից հետո
for( $i=0; $i <= 10; ++ $i ) {
    echo $i;
} // Այստեղ կետ-ստորակետ չի դրվում

while( $i <= 10 ) {
    echo $i++;
} // Այստեղ կետ-ստորակետ չի դրվում

foreach( $array as $key => $value ) {
    echo "$key => $value \n";
} // Այստեղ կետ-ստորակետ չի դրվում

```

Ֆունկցիային փոփոխականներ կարելի է տալ ինչպես արժեքով, այնպես էլ հղումով (օգտագործելով & նշանը)։

### Տվյալների տիպեր

PHP-ն դինամիկ տիպավորմամբ լեզու է, ուստի փոփոխականների հայտարարման ժամանակ դրանց տեսակը նշել հարկավոր չէ։ Տարբեր սկալյար տիպերի միջև փոխակերպումն իրականացվում է անուղղակիորեն և առանց ավելորդ ջանքերի (սակայն PHP-ն նաև լայն հնարավորություններ է տալիս դրանց ուղղակիորեն փոխակերպման համար)։

Սկալյար տիպերն են՝

* ամբողջ թվերը (integer),
* բնական (տասնորդական կոտորակով) թվերը (float, double),
* տրամաբանակ տիպը (boolean),
* տողային տիպերը (string),
* և NULL հատուկ տիպը։

Ոչ սկալյար տիպերն են՝

* «ռեսուրսները» (resource),
* զանգվածները (array),
* օբյեկտները (object)։

Կեղծ տիպերն են՝

* mixed - մեկ կամ մի քանի ոչ պարտադիր պարամետրեր,
* number - թիվ (integer կամ float)
* callback - վերադարձվող տվյալներն ընդունողը (string կամ անանուն ֆունկցիա)
* void - պարամետրի բացակայությունը։

PHP-ում ամբողջ թվերի (integer) միջակայքը կախված է համակարգչային հարթակից (հիմնականում դրանք ընկած են լինում −2 147 483 648-ից 2 147 483 647-ի սահմաններում)։ Թույլատրվում են տասական, ութական և տասնվեցական համակարգերի թվերի օգտագործումը։ Բնական թվերի միջակայքը (double) նույնպես կախված է հարթակից (32-բիթային կառուցվածքով համակարգչի համար այդ միջակայքը ընկած է ±1.7×10−308-ից ±1.7×10+308-ի միջև)։

PHP-ն մշակողներին է ներկայացնում տվյալների տրամաբանական տիպը (boolean), որը կարող է ընդունել ընդամենը երկու արժեք՝ TRUE («ճիշտ») և FALSE («սուտ»)։ 0 թիվը, դատարկ տողը, տողային տիպում պարունակվող զրոն ("0"), NULL-ը կամ դատարկ զանգվածը տրամաբանական տիպի փոխարկելիս ստացում է FALSE, մնացած բոլոր տիպերը և արժեքները փոխարկելիս ստացվում է TRUE։

NULL հատուկ տիպը նախատեսված է որոշակի արժեքի չունեցող փոփոխականների համար։ Այս տիպի փոփոխականները կարող են ընդունել միայն NULL արժեքը։

Դեպի արտաքին «ռեսուրսներ» հղումներն կրում են resource տիպը։ Այս տիպի փոփոխականները, որպես կանոն, իրենցից ներկայացնում են descriptor-ներ, որոնք թույլ են տալիս կառավարել այնպիսի արտաքին օբյեկտներ, ինչպիսիք են ֆայլերը, նկարները, տվյալների բազաների աղյուսակների արդյունքները և այլն։

Զանգվածները (array) աջակցում են թվային կամ տողային բանալիներ և հանդիսանում են հետերոգեններ։ Զանգվածները կարող են պարունակել ցանկացած տիպի արժեքներ, այդ թվում՝ այլ զանգվածներ։ Տարրերի դասավորությունը պահպանվում է։

### Փոփոխականների և ֆունկցիաների դիմելաձև

Փոփոխականներին դիմումը իրականացվում է $ նշանի օգնությամբ, որին հետևում է փոփոխականի անվանումը։ Այս կանոնը կիրառվում է նաև դինամիկ փոփոխականների և ֆունկցիաների ստեղծման համար։ Օրինակ՝

PHP-ում echo-ն և print-ը ֆունկցիաներ չեն (չնայած print-ը արժեք է վերադարձնում)։ Դրանք շարահյուսական միավորներ են։ Դրանք օգտագործելուց փակագծերը կարելի է չգրել։

### Սուպերգլոբալ զանգվածներ

```
$a = 1;
$b = 2;

$c = $a\*$b;

if($c>=3)

{print\_r($c);
print\_r('<br>');
print\_r("3 = 3");
}

```
Սուպերգլոբալ զանգվածներ (անգլ.՝ Superglobal arrays) են անվանում PHP-ում նախորոշված զանգվածները, որոնք ունեն տեսանելիության գլոբալ մակարդակ՝ առանց global դիրեկտիվի կիրառման։ Դրանց մեծամասնությունը իրենց մեջ պարունակում են օգտագործողի հարցման մուտքային տվյալները (GET հարցման պարամետրերը, POST մեթոդով ուղարկված ֆորմայի դաշտերի արժեքները, քուքիները և այլն)։

Բոլոր սուպերգլոբալ զանգվածները, $GLOBALS-ից և $\_REQUEST-ից բացի, նախկինում ունեին երկար անուններով անալոգներ։ Դրանք PHP 5.3-ում համարվեցին հնացած, իսկ PHP 5.4-ում՝ հեռացվեցին։

$GLOBALS
Բոլոր գլոբալ (այդ թվում՝ օգտագործողների կողմից ստեղծված) փոփոխականների զանգվածը։
$\_SERVER (հնացած անալոգը՝ $HTTP\_SERVER\_VARS)
Պարունակում է շրջապատի փոփոխականները, որոնք օպերացիոն համակարգը փոխանցում է սերվերին
$\_ENV (հնացած անալոգը՝ $HTTP\_ENV\_VARS)
Այն միջավայրի փոփոխականները (անգլ.՝ Environment variables), որտեղ կատարվում է սկրիպտը։ Դրանց հավաքածուն հատուկ է յուրաքանչյուր հարթակի համար։
$\_GET (հնացած անալոգը՝ $HTTP\_GET\_VARS)
Պարունակում է GET-հարցման պարամետրերը, որոնք փոխանցվում են URI հասցեի միջոցով՝ «?» նշանից հետո գրելով դրանց հարժեքները։
$\_POST (հնացած անալոգը՝ $HTTP\_POST\_VARS)
HTML ֆորման POST մեթոդով ուղարկելուց դրա դաշտերի արժեքների ասոցիատիվ զանգվածը։ Տարրերի ինդեքսները համապատասխանում են HTML ֆորմայի դաշտերի name ատրիբուտին։
$\_FILES (հնացած անալոգը՝ $HTTP\_POST\_FILES)
POST մեթոդով ուղարկած ֆայլերի մասին տվյալների ասոցիացվող զանգվածը։ Զանգվածի յուրաքանչյուր տարր կրում է ֆորմայի դաշտի name ատրիբուտի արժեքին համապատասխան ինդեքս և, իր հերթին, իրենից ներկայացնում է տվյալ ֆայլի տվյալներ պարունակող զանգված։ Այդ զանգվածի տարրերն են՝
* ['name'] - օգտագործողի համակարգչում տեղակայված ֆայլի անունը։
* ['type'] - օգտագործողի բրաուզերի կողմից նշված ֆայլի MIME տեսակը։ PHP-ն չի ստուգում այն, և, հետևաբար, ոչ մի երաշխիք չկա, որ նշված տեսակը այն է, ինչ պետք է կայքին, կամ ընդհանրապես գոյություն ունի։
* ['size'] - ֆայլի չափսը (բայթերով)
* ['tmp\_name'] - ժամանակավոր պանակում գտնվող ֆայլի լրիվ հասցեն։ Ֆայլը վերբեռնելիս, PHP-ն այն տեղադրում է հատուկ ժամանակավոր պանակ։ Այն այնտեղից հարկավոր է տեղափոխել մեր ուզած պանակը՝ օգտագործելով move\_uploaded\_file ֆունկցիան, որից հետո PHP-ն ֆայլը հեռացնում է ժամանակավոր պանակից։
* ['error'] - սխալի կոդը։ Եթե ֆայլը հաջող վերբեռնված է, ապա սխալի կոդը հավասար կլինի 0-ի (UPLOAD\_ERR\_OK)։

$\_COOKIE (հնացած անալոգը՝ $HTTP\_COOKIE\_VARS)
Օգտագործողի բրաուզերի կողմից ուղարկված քուքիների ասոցիացվող զանգվածը։
$\_REQUEST
Պարունակում է $\_GET, $\_POST և $\_COOKIE զանգվածների տարրերը միասին վերցրած, իսկ սկսած PHP 4.1 տարբերակից՝ նաև $\_FILES զանգվածի տարրերը։
$\_SESSION (հնացած անալոգը՝ $HTTP\_SESSION\_VARS)
Պարունակում է սեսիայի տվյալներ
### Օբյեկտային կողմնորոշմամբ ծրագրավորում

PHP-ն օբյեկտային կողմորոշմամբ ծրագրավորման (անգլ.՝ Object-oriented programming, OOP) համար ունի լայն հնարավորություններ, որոնց լրիվ աջակցումը սկսվել է լեզվի 5-րդ տարբերակից սկսած։

Դասերը PHP-ում հայտարարվում են class բանալի բառի միջոցով։ Դասի մեթոդները և դաշտերը կարող են լինել հանրային (public, լռելյան բոլոր մեթոդներն ու դաշտերը հանրային են), պաշտպանված (protected) և թաքնված (private)։ PHP-ն աջակցում է OOP-ի բոլոր երեք մեխանիզմները՝ ինկապսուլյացիա, պոլիմորֆիզմը (կամ, այլ կերպ ասած, տարաձևությունը) և ժառանգումը (ծնողական դասը նշվում է դասի անավումից հետո գրելով extends բանալի բառը, որին հաջորդում է ծնողական դասի անվանումը)։ PHP-ն նաև աջակցում է միջերսներ (հրապարակվում է interface, և օգտագործվում՝ implements բանալի բառերի օգնությամբ)։ Թույլատրվում է հրապարակել ավարտվող և աբստրակտ մեթոդներ ու դասեր։ Դասերի բազմակի ժառանգումն չի աջակցվում, սակայն դասը կարող է իրագործել մի քանի միջերես։ Ծնողական դասի մեթոդներին դիմելու համար հարկավոր է օգտագործել parent բանալի բառը։

5.4.0 տարբերակից սկսած բազմակի ժառանգումը կարող է կատարվել նաև trait-ների միջոցով։ Trait-ները նման են mixin-ներին, սակայն trait-ների դեպքում ուղղակի ձևով հնարավոր չէ ստեղծել օբյեկտ։ Կոդի բազմակի օգտագործումը դրսևորվում է տարբեր դասերում trait-ի կոդի օգտագործմամբ։ Մեկ դասում թույլատրվում է օգտագործել մեկից ավելի trait։

PHP-ում դասերն ունեն մի շարք, այսպես կոչված, կախարդական մեթոդներ (անգլ.՝ magic methods), որոնք սկսում են երկու ընդգծման նշանից։ Դրանցից պետք է նշել կառուցողը (\_\_construct(), մինչև լեզվի 5.0 տարբերակը կառուցող էր համարվում այն մեթոդը, որի անվանումը համընկնում էր դասի անվանման հետ) և ապակառուցողը (\_\_destruct()), ինչպես նաև դասից տվյալներ ստանալու (\_\_get()) և գրելու (\_\_set()) մեթոդները, օբյեկտը «քնեցնելու» (\_\_sleep()) և «արթնացնելու» (\_\_wake()), կլոնավորման (\_\_clone()) և այլն։ Այս մեթոդները բավականին ճկուն գործիքներ են, քանի որ դրանք կարող են զգալիորեն փոփոխել օբյեկտի պահվածքը։

Դասի օբյեկտները ստեղծվում են new բանալի բառի օգնությամբ։ Օբյեկտի դաշտերին ու մեթոդներին կարելի է դիմել **->** օպերատորի օգնությամբ։ Դասի մեթոդների միջից նույն դասի այլ անդամներին դիմելու համար օգտագործվում է $this փոփոխականը։

```
class C1 extends C2 implements I1, I2
{
  private $a;
  protected $b;

  function \_\_construct($a, $b)
  {
    parent::\_\_construct($a, $b);
    $this->a = $a;
    $this->b = $b;
  }

  public function plus()
  {
    return $this->a + $this->b;
  }
/\* ............... \*/
}

$d = new C1(1, 2);
echo $d->plus(); // 3

```

PHP 5-ից սկսած, օբյեկտները փոխանցվում են հղումների ձևով՝

```
class a 
{
  public $color = 'red';
}

$a = new a();
echo $a -> color; // red
$b = $a;
$b -> color = 'blue';
echo $a -> color; // blue

```

**«Paamayim Nekudotayim»** (իվրիտ։ פעמיים נקודתיים) կամ ուղղակի «կրկնակի երկուկետ»։ Օգտագոևծելով այս լեքսեմը՝ ծրագրավորողը կարող է դիմել դասի հաստատուններին և ստատիկ դաշտերին ու մեթոդներին։

Այդ դասից դուրս այդ տարրերին դիմելու համար անհրաժեշտ է օգտագործել դասի անվանումը։
«Paamayim Nekudotayim»-ն առաջին հայացքից, հնարավոր է, թվա, որ այն կրկնակի երկուկետի համար տարօրինակ անվանում է։ Սակայն, Zend Engine 0.5-ի ստեղծման ժամանակ (որը PHP3-ի հետ էր տրվում) Andi-ն և Zeev-ը ընտրել են հենց հենց այդ նշանակումը։ «Paamayim Nekudotayim» իվրիտից թարգմանաբար իրոք նշանակում է «կրկնակի երկուկետ»։ Այդ անվանումը PHP-ի մշակմաբ ամբողջ ժամանակ մնացել է նույնը և ոչ մի անգամ չի փոխվել։

```
<?php
class MyClass {
  const CONST\_VALUE = 'Հաստատունի արժեքը';
}
// Ստանում ենք հաստատունը՝ օգտագործելով։ նշանը հրապարակված դասից հետո
echo MyClass::CONST\_VALUE;
?>

```

Ինտեգրված զարգացման միջավայրեր PHP-համար
----------------------------------------

| Անվանում | Արտոնագիր | Կայք |
| --- | --- | --- |
| Codelobster | Freeware |  |
| Komodo | Mozilla tri-license (MPL/LGPL/GPL) |  |
| JetBrains PhpStorm | Proprietary software |  |
| PHP Development Tools | Eclipse Public License |  |
| Zend Studio | Shareware |  |
| Aptana Studio | GNU GPL |  |
| phpDesigner | Shareware |  |
| PHP Expert Editor | Shareware |  |
| NetBeans IDE | CDDL |  |
| RadPHP XE | Trial |  |
| NuSphere | Trial |  |
| KDevelop | GNU GPL |  |
| Microsoft WebMatrix | Freeware |  |
| Notepad++ | GNU GPL |  |
| Sublime Text 2 | Proprietary software |  |
| VS.Php for Visual Studio | Proprietary software |  |
| PHP Tools for Visual Studio | Trial |  |
| DevelNext | MPL-2.0 |  |
| jEdit | GNU GPL-2.0 |  |
|

Ինտերպրետատորի առանձնահատկությունները
-------------------------------------

PHP սրիպտերը հիմնականում գործարկվում են ինտերպրետատորի միջոցով հետևյալ հաջորդականությամբ՝

1. ելակետային կոդի լեքսիկական վերլուծություն և լեքսեմների գեներացում,
2. ստացված լեքսեմների շարահյուսական վերլուծություն,
3. բայթ-կոդի գեներացում,
4. բայթ-կոդի կատարումը ինտերպրետատորի միջոցով (առանց գործարկվող ֆայլի ստեղծման)։

Հավելվածների արագագործության համար հաճախ օգտագործվում են հատուկ ծրագրային ապահովումներ, այսպես կոչված, արագացուցիչներ։ Դրանք քեշավորում են արդեն մեկ անգամ գեներացված բայթ-կոդը օպերատիվ հիշողության և/կամ կոշտ սկավառակի մեջ, որի շնորհիվ PHP սկրիպտերի գործարկման հաջորդականության մեջ 1-3 կետերն չեն կատարվում, այլ միանգամից անցում է կատարվում 4-րդ կետին՝ բայթ-կոդի կատարմանը, ինչը բերում է աշխատանքի նշանակալի արագացման։

PHP-ի կարևոր առանձնահատկությունն այն է, որ ծրագրավորողը այլևս կարիք չունի հոգալու հիշողության մաքրման մասին։ PHP-ի մոդուլն ինքն է կառավարում հիշողության մաքրումը․ սկրիպտի աշխատանքի ավարտից հետո ամբողջ առանձնացված հիշողությունն ազատվում է։

### Ընդլայնումներ

Ինտերպրետատորը կազմված է միջուկից և նրան առանձին միացվող մոդուլներից՝ *«ընդլայնումներից»*, որոնք իրենցից ներկայացնում են դինամիկ գրադարաններ։ Ընդլայնումներն թույլ են տալիս լրացնել լեզվի հիմնական հնարավորությունները, թույլ տալով աշխատել տվյալների բազաների, սոքեթների, դինամիկ գրաֆիկայի, գաղտնագրության գրադարանների, PDF ձևաչափի փաստաթղթերի և նմանօրինակ այլ համակարգերի ու ստանդարտների հետ։ Ամեն ոք կարող է մշակել սեփական ընդլայնումը և միացնել այն միջուկին։ Այսօր գոյություն ունեն մեծ թվով ընդլայնումներ, ինչպես ստանդարտ, այնպես էլ մեկ այլ ընկերությունների կամ էնտուզիաստների կողմից ստեղծված, սակայն ստանդարտ միջուկի հետ տեղադրվում են միայն մի քանի տասնյակ ընդլայնումներ, որոնք իրենց, այսպես ասած, «լավ են դրսևորել»։ Բազմաթիվ ընդլայնումներ հասանելի են PECL բաժանորդագրությունում։

### Կարգավորման պարամետրեր

PHP-ի ինտերպրետատորն ունի հատուկ կազմաձևման ֆայլ՝ php.ini-ն, որն պարունակում է բազմաթիվ կարգավորումներ, որոնց փոփոխումն ազդում է ինտերպրետատորի վարքագծի վրա։ Հնարավորություն կա անջատել մի շարք չօգտագործվող ֆունկցիաներ, փոխել սկրիպի կողմից օգտագործվող օպերատիվ հիշողության, ժամանակի, վերբեռնվող ֆայլերի չափսի սահմանափակումները, կարգավորել սխալների գրանցումը, սեսսիաների և փոստային ծառայությունների հետ աշխատանքը, միացնել լրացուցիչ ընդլայնումներ և այլն։ Սկրիպտի կատարման ժամանակ այդ պարամետրերը հնարավոր է փոխել ini\_set ֆունկցիայի միջոցով։

### Ինտերպրետատորի ռեժիմներ

Գոյություն ունեն PHP ինտերպրետատորի օգտագործման մի շարք եղանակներ։

1. Որպես մոդուլ վեբ-սերվերի համար SAPI-ի կամ ISAPI-ի միջոցով (օրինակ, mod\_php մոդուլը Apache-ի համար)։ Վեբ-սերվերը գործարկվում է բեռնված մոդուլով և php սկրիպտին դիմելիս այն կատարվում է վեբ-սերվերի գործընթացի միջավայրում։ Սա, բավականին հեշտ կոնֆիգուրացիայի շնորհիվ, PHP-ի օգտագործման առավել տարածված եղանակն է։

### «Զատիկի ձվերը»

PHP-ն ունի մի քանի, այսպես կոչված, «զատիկի ձվեր» (կատակներ)։ Ցանկացած PHP սկրիպտին տալով հատուկ GET պարամետրեր, էսի փոխարեն կարելի է տեսնել տարբեր պատկերներ։

Օրինակ՝

```
file.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
```

Մուտքագրելով այս պարամետրը բրաուզերի հասցեի տողում, կարելի է տեսնել տարբեր պատկերներ՝ կախված ինտերպրետատորի տարբերակից՝

1. *Thies Arntzen*-ի նկարը (4.1.2, 4.2.2 տարբերակներում)
2. տաքսա ցեղատեսակի շան նկար (շան տերը՝ *Stig Bakken*) (4.3.2, 4.3.3, 4.3.8 - 4.3.10 տարբերակներում)
3. տերիեր ցեղատեսակի շան նկար (շան տերը՝ *Zeev Suraski*) (4.3.11, 4.4.0 - 4.4.4, 5.1.0, 5.1.2 տարբերակներում)
4. ճագարի նկար (4.3.1, 5.0.0, 5.0.3 տարբերակներ)
5. PHP-ի աղավաղված պատկերանշանը (5.1.3 - 5.2.13 տարբերակներ)
6. խաղալիք կապույտ փղի նկարը, որի վրա գրված է PHP (սկսած 5.3.0 տարբերակից)

Հաջորդ 2 պարամետրերը հնարավորություն կտան տեսնել, համապատասխանաբար, PHP-ի և ZEND-ի ստանդարտ պատկերանիշերը՝

```
file.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
file.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
```

Ինչպես նաև կարելի է տեսնել PHP 4 և 5 տարբերակների բոլոր հեղինակների անունները՝

```
file.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
```

Ծանոթագրություններ
------------------

1. ↑  Google Groups
2. ↑  PHP: History of PHP - Manual
3. 1 2
4. ↑
5. ↑
6. ↑
7. ↑  Using mod\_php as a DSO (deprecated) // php - Httpd Wiki
8. ↑  Using CGI Programs
9. ↑
10. ↑
11. ↑
12. ↑
13. ↑
14. 1 2 3  PHP: Preface - Manual
15. ↑  Rasmus Lerdorf | PHP on Hormones — 2013.
16. ↑
17. ↑
18. ↑  «PHP: Preface - Manual» (անգլերեն). Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2011 թ․ նոյեմբերի 19-ին.
19. 1 2  TIOBE Software: Tiobe Index
20. ↑  «History of PHP and related projects» (անգլերեն). Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2011 թ․ նոյեմբերի 19-ին.
21. 1 2  «PHP: PHP 4 ChangeLog». The PHP Group. 2008 թ․ հունվարի 3. Վերցված է 2008 թ․ փետրվարի 22-ին.
22. ↑  «PHP: Using PHP from the command line – Manual:». The PHP Group. Վերցված է 2009 թ․ սեպտեմբերի 11–ին-ին.
23. ↑  «Downloads». PHP. Վերցված է 2009 թ․ հուլիսի 29-ին.
24. ↑  «4.4.9 Release Announcement». PHP. Վերցված է 2009 թ․ հուլիսի 29-ին.
25. ↑  «PHP manual: PDO». The PHP Group. 2011 թ․ նոյեմբերի 15. Վերցված է 2011 թ․ նոյեմբերի 15–ին-ին.
26. ↑  PHP: News Archive - 2010
27. ↑  «Built-in web server». Վերցված է 2012 թ․ մարտի 26-ին.
28. ↑  «PHP 6: Features, Release Date, Hosting and Download». Վերցված է 2011 թ․ մայիսի 6-ին.
29. ↑  «PHP: Pseudo-types and variables used in this documentation - Manual». Արխիվացված է օրիգինալից 2012 թ․ մայիսի 6-ին. Վերցված է 2012 թ․ հունիսի 11-ին.
30. ↑  PHP: Variable variables
31. ↑  PHP: echo
32. ↑  Description of core php.ini directives ― register\_long\_arrays (անգլ.)
33. ↑  Հնարավոր է, որ այն վերցված է C++-ից
34. ↑
35. ↑  «Komodo IDE is a Professional Development Environment for Perl, Python, Tcl | ActiveState». Արխիվացված է օրիգինալից 2008 թ․ դեկտեմբերի 20-ին. Վերցված է 2012 թ․ օգոստոսի 23-ին.
36. ↑  Предусмотрена бесплатная регистрация для граждан exUSSR
37. ↑  PHP support for KDevelop 4 (and eventually Quanta+) | Milian Wolff
38. ↑  «PHP: Basic memory management - Manual» (անգլերեն). 13 նոյեմբերի, 2009 թ․. Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2009 թ․ նոյեմբերի 17–ին-ին.
39. ↑  «PHP: php.ini directives - Manual» (անգլերեն). 6 նոյեմբերի, 2009 թ․. Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2009 թ․ նոյեմբերի 13–ին-ին.
40. ↑  «PHP: List of php.ini directives - Manual» (անգլերեն). 6 նոյեմբերի, 2009 թ․. Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2009 թ․ նոյեմբերի 13–ին-ին.
41. ↑  PHP: Installed as an Apache module - Manual
42. 1 2 3 4  «PHP Easter Egg» (անգլերեն). Արխիվացված օրիգինալից 2011 թ․ օգոստոսի 21-ին. Վերցված է 2009 թ․ նոյեմբերի 16–ին-ին.

Արտաքին հղումներ
----------------

* **Официальный сайт** PHP(անգլ.)
* Руководство по PHP(ռուս.) (включая FAQ)
* Книги по PHP(ռուս.) (включая английсскую литературу)