‘PHP’ კატეგორიაში გამოქვეყნებული წერილები

Zend PHP Certification: PHP Basics, part 2

Saturday, September 19th, 2009

ორიოდ სიტყვას კიდევ ვიტყვი რიცხვით ტიპებზე, რადგან წინა პოსტში რაღაცეები გამოვტოვე.

Integer ტიპის ზომა პლატფორმაზეა დამოკიდებული.
32 ბიტიანი სისტემისთვის რიცხვი უნდა იყოს შუალედში -2^31 და 2^31-1
64 ბიტიანი სისტემისთვის -2^63 და 2^63-1

თექვსმეტობით (hexadecimal) წარმოდგენილი რიცხვისთვის ეს შუალედები განსხვავდება:
32 ბიტიანი სისტემისთვის 0-დან 2^31-1 -მდე
64 ბიტიანი სისტემისთვის 0-დან 2^63-1 -მდე.

თუ ინტერპრეტატორს შეხვდება რიცხვი ამ საზღვრებს გარეთ (overflow), ის რიცხვს float ტიპად მიიღებს.

$large_number =  2147483647;  // = 2^31-1
var_dump($large_number);
// output: int(2147483647)

$large_number =  2147483648;  // = 2^31
var_dump($large_number);
// output: float(2147483648)

Float ტიპის ზომაც პლატფორმაზეა დამოკიდებული თუმცა მაქსიმალური მნიშნველობა მიახლოებით 1.8e308-ია (64 ბიტიანისთვის, თუ სწორად გავიგე).

Float ტიპის რიცხვები შეიძლება წარმოვადგინოთ შემდეგი სინტაქსით (მთელის და წილადის გამოსაყოფად აუცილებლად წერტილია საჭირო და არა მძიმე):

<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

გასათვალისწინებელია, რომ PHP-ის შემთხვევაში ამ ტიპის რიცხვები სიზუსტეს კარგავს ბინარულში გადასვლის შემდეგ. მაგალითად (int)((0.1 + 0.7) * 10) საბოლოო ჯამში მოგვცემს 7-ს და არა 8-ს. (0.1 + 0.7)*10 გვაძლევს 7.99999..-ს. (მთელ რიცხვზე (int) დაყვანის დროს, რიცხვი ქვედა ზღვრისკენ მრგვალდება.)

ამიტომ თუ მათემატიკური გამოთვლები ან შედარება გვჭირდება float ტიპით, ყოველთვის BC math ან gmp ფუნქციები უნდა გამოვიყენოთ.

ოპერატორები

ოპერატორი შეიძლება წარმოვიდგინოთ, როგორც რაღაც, რასაც გადავცემთ ერთ ან მეტ მნიშვნელობას ან გამოსახულებას და ის თავის მხრივ რაღაც მნიშვნელობას გვიბრუნებს. ასე რომ ფუნქციებიც (მაგალითად print) შეგვიძლია ოპერატორებში ჩავთვალოთ, მაგრამ არა ისეთი კონსტრუქციები, რომელიც არაფერს აბრუნებს (მაგალითად echo).

ოპერატორები დაყოფილია ტიპებად (მხოლოდ რამდენიმე დეტალს ჩავუღრმავდები, დანარჩენი ჩვეულებრივი განმარტებები php.net-ზეა ან აგერ ქართულად ამ ლინკზე):

არითმეტიკული ოპერატორები

მინიჭების ოპერატორები

ბიტური ოპერატორები
გასათვალისწინებელია შესრულების მიმდევრობა. მაგალითად == შედარებას უფრო მაღალი პრიორიტეტი აქვს ვიდრე & ბიტურ ოპერაციას, ამიტომ  $a & $b  == true  შემთხვევაში ჯერ შედარება შესრულდება.

კიდევ ერთი რამ: რატომ ვწერთ ხოლმე შეცდომების რეპორტინგის ჩართვის დროს მაგალითად ასეთ რამეს? E_ALL & ~E_NOTICE

error_reporting-ი მიმდინარე სეთინგების შესანახად bitmask-ს იყენებს. თითოეულ ასეთი კონსტანტის უკან ბიტების ერთობლიობა დგას.

მაგალითად
E_ALL –ს შეესაბამება  00000000000000000111011111111111.
E_NOTICE  => 00000000000000000000000000001000
(ანუ ბოლოდან მეოთხე ბიტი როცა ”ჩართულია”, ეს ნიშნავს რომ E_NOTICE ჩართულია)
~E_NOTICE გამოვა => 11111111111111111111111111110111
E_ALL & ~E_NOTICE   => 00000000000000000111011111110111

საბოლოო ჯამში მოგცემს მთელ სიმრავლეს ოღონდ შენიშვნების (notice) გამოკლებით.

შედარების ოპერატორები
ამ ოპერატორებიდან and და && ზუსტად ერთნაირად მოქმედებენ. ასევეა or და ||. განსხვავება მათ შორის მხოლოდ შესრულების მიმდევრობის პრიორიტეტებშია. && და ||  ოპერატორებს უფრო მაღალი პრიორიტეტი აქვთ შესრულების დროს ვიდრე მათ შესაბამის სიტყვიერ ჩანაწერებს.

შეცდომების კონტროლის ოპერატორები
ასეთი php-ში მხოლოდ ერთია  -   @, რომელიც შეცდომის დასაფარად გამოიყენება. ეს არ ნიშნავს, რომ ის კოდში მომხდარ შეცდომას მიხედავს, არამედ უბრალოდ შეცდომის შეტყობინებას არ გამოიტანს. ამიტომ მისი გამოყენების დროს სიფრთხილეა საჭირო და ის არ არის try..catch -ის შემცვლელი (ჩვეულებრივ მოქმედებს ფატალური შეცდომების დროსაც, როცა სკრიპტი შესრულებას წყვეტს. შეცდომის შეტყობინებას მაინც არ გამოიტანს).

სისტემური ბრძანების შესრულების ოპერატორები
ასეთი ბრძანების გასაშვებად გამოიყენება ` ` ბრჭყალები (backticks). მაგალითად echo `ls -al`;

ისინი არ მუშაობენ თუ ჩართულია safe_mode ან გამორთულია shell_exec()

მნიშნველობის გასაზრდელი/შესამცირებელი ოპერატორები (++ –)
boolean ტიპზე არ მოქმედებს.

ლოგიკური ოპერატორები
აქ მხოლოდ იმას შევნიშნავ, რომ ოპერანდების მნიშვნელობიდან და ოპერატორიდან გამომდინარე შედეგის მისაღებად ყველა ოპერანდის შესრულება საჭირო არ არის და არც სრულდება. მაგალითად if (false && some_function()) { }  ასეთ შემთხვევაში some_function() არასდროს გამოიძახება, რადგან false და && უკვე ნიშნავს რომ საბოლოო შედეგიც false იქნება.

სტრიქონის ოპერატორები ( .   .= )

მასივის ოპერატორები

ტიპის ოპერატორები (instanceof)

შეკითხვები:

1. რა მნიშვნელობები იქნება float1 და float2 ცვლადებში? (php.net)

$float1 = (float) '1.5';
$float2 = (float) '1,5';

1.5
1

2. რა შედეგი ექნება კოდს? (php.net)

<?php
var_dump(25/7);
var_dump((int) (25/7));
var_dump(round(25/7));
?>

float(3.5714285714286) -> / ოპერატორი არ ასრულებს მთელ გაყოფას და ჩვეულებრივ float-ს გვაძლევს შედეგად.
int(3)
float(4)

3. რა შედეგი ექნება f() ფუნქციის გამოძახებას? (php.net)

int f()
{
  int a, b;
  a = 2, b = 4;

  return a;
}

პარსირების შეცდომა მოხდება. C ენისგან განსხვავებით php-ში მძიმის გამოყენება არ შეიძლება ესეთი კომბინირებული expression-ების დასაწერად. თუმცა for ციკლში დაშვებულია. ასეთი რამ იმუშავებს: for ($a = 2, $b = 4; $a < 3; $a++) { }

4. რა შედეგი ექნება კოდს?

$a = -10 % 3;
$a += "1";
echo $a;

0
მოდულით გაყოფის დროს თუ ერთ ერთი უარყოფითია, პასუხიც უარყოფითია.
რიცხვით ტიპს თუ ვამატებთ სტრიქონს, სტრიქონი რიცხვზე დაიყვანება და ისე შესრულდება ოპერაცია.

5. რა შედეგი ექნება კოდს?(php.net)

$a=1;
$a  +=  $a++   +   ++$a;
echo $a;

1. ++$a is first incremented. Now $a is 2.
$a += $a++ + 2
$a is 2

2. $a++ is added to 2 then $a is incremented
$a += 2 + 2
$a is 3

3. now the value of 2 + 2 is added to $a ($a is 3)
$a = $a + 2 + 2

Answer: 3 + 2 + 2 = 7

6. რა მნიშვნელობა იქნება $a ცვლადში ამ სტრიქონის შესრულების შემდეგ (php.net)?

$a = true ? 0 : true ? 1 : 2; 

(true ? 0 : true) ? 1 : 2 = 2

7. რას დაბეჭდავს კოდი (php.net)?

echo 2 ^ "3";
echo "2" ^ 3;

1 1
ორივე შემთხვევაში int-ზე დაიყვანს
2 ^ ((int)”3″) => 1
((int)”2″) ^ 3 => 1

8. რას დაბეჭდავს კოდი?

function f(){
  echo 'I am inside f function\n';
  return false;
}

if (true | f()){
	echo 'bla bla bla';
}

I am inside f function
bla bla bla

| ოპერატორი || -ის მსგავსად short-circuit არ არის. ორივე მხარე შესრულდება, იმის მიუხედავად, რომ პირველი ოპერანდი true-ს უდრის.

9. რას დაბეჭდავს კოდი?

$a=true;
$a--;
echo $a;

1
++ და — ოპერატორები ბულის ტიპებზე არ მოქმედებს.

NetBeans IDE + Subversion

Sunday, April 12th, 2009

საიდან დავიწყო არ ვიცი… :)

სულ თავიდან მჭირდებოდა რამე IDE php-ისთვის. ჩვეულებრივ Dreamweavers ვიყენებ ამ ენისთვის, იშვიათად notepad++. მაგრამ დებაგს მაინც ვერ ველევი, tasklist-იც მაკლია :( და დღეს გადავწყვიტე კიდევ ერთხელ ჩამოვუარო სხვა IDE-ებს.

პირველ რიგში მივიწყებული Aptana გავუშვი. დიდის ამბით გადავიტანე პროექტები, მაგრამ რად გინდა. სერვერებს ვერაფერი მოვუხერხე. ვაღიარებ, ჩემი ბრალია :blush2: მაგრამ მაინც ვერაფერი ვნახე bundled სერვერებზე. და ბოლოს იმდენად დამღალა, თავი დავანებე. + ამას რაღაცნაირად ნელია. და არც დებაგი აქვს მთლად ისეთი, რისი ხათრითაც დავრჩებოდი…

Eclipse-ს ვერ მოვერგე… მომავალ ჩამოვლაზე კიდევ შეიძლება მოსინჯვა..

მერე გამახსენდა რომ ჩემს საყვარელ NetBeans აქვს php-ის სამუშაო გარემო, რომელიც ცალკე აპლიკაციად (მხოლოდ PHP) შეიძლება გადმოწეროს კაცმა. საკმაოდ სწრაფია და მოსახერხებელიც თავისი პლაგინებით.. ერთადერთი რაც ხელს მიშლის, უნიკოდია. ქართული ასოები რომ გამოჩნდეს, sylfean ფონტი უნდა იყოს რედაქტორში არჩეული. sylfean-ი კიდევ მონოსპეისდი არ არის :D

ფონტებს ადრე არც ვაკვირდებოდი ხოლმე, მაგრამ როცა ჩვეულებრივი ფონტით დაიწყებთ პროგრამის წერას, მაშინვე შეეტყობა, რატომაც არის ძნელი.. :)  ყველა ასო ერთი სიგანის უნდა იყოს. მე მგონი ფონტების რედაქტორი დამეხმარება ამ პრობლემის მოგვარებაში..

აი, მერე დაიწყო არც თუ ისე სასიამოვნო რაღაცა. თურმე Subversion-ის ვერსიებთან აქვს პრობლემა. ნეტბინსი მის 1.5.x ვერსიას ერგება. არადა ჩემთან უკვე 1.6.x წერია… ასე რომ გადატანილ პროექტებზე, შენი დიდი ხათრი მაქვს, მაგრამ ვერ გადავწერ-გადმოვწერ-დავააფდეითებო.. უკუთავსებადი არ ყოფილა…

რა შეიძლება ქნას ადამიანმა? ძველ ვერსიაზე დააბრუნოს subversion-ი. მაგრამ ოფიციალურ საიტზე ძველ ვერსიას ვერ ნახავთ :) სამაგიეროდ შეხვდებით პითონზე დაწერილ დაუნგრეიდის სკრიპტს. და ინსტრუქციას: ”გამოძახების დროს პარამეტრად –help გადაეციო”. ასეთ დროს უკვე დაღლილი ხარ და შეიძლება ვერ მიხვდე რას უნდა ნიშნავდეს მთავარი პარამეტრის აბრევიატურა WC_PATH. მოკლედ დავიწყე სკრიპტში ქექვა :D

ეს იმ პროექტის ძირეული დირექტორიაა, რომლის ვერსიის შეცვლაც გინდათ. ანუ მთავარ პროგრამას სინამდვილეში არაფერი მოსდის. მხოლოდ იმ ერთ პროექტს შეეცვლება svn-ის ფაილების ფორმატი.

პ.ს. თუ ამ გზით წახვალთ, ჩემსავით არ დაგავიწყდეთ, რომ კონსოლიდან გაშვების დროს პარამეტრებს ბრჭყალები უნდა :D

პ.პ.ს. ბზობის დღესასწაულს გილოცავთ :)

Regular Expressions

Tuesday, January 20th, 2009

ერთ-ერთი პატარა პრობლემა, რომელზეც რამდენიმე კვირის წინ დავკარგე დრო, რეგულარულ გამოსახულებებს ეხებოდა. კერძოდ კი, როგორც ჯავაში ვიყენებდი მათ, ისე მინდოდა დამეწერა php-ზე ფილტრისთვის.
არ იმუშავა. მაგალითისთვის მარტივი გამოსახულება ავიღოთ.
ვთქვათ, მინდა რომ სტრიქონი შეიცავდეს მხოლოდ ლათინურ ასოებს.
ჯავაში იქნებოდა ასე:

String regex="[a-zA-Z]+”;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(”StringToMatch”);
System.out.println(matcher.matches());

იგივე გადავიტანე მეორე ენაზე.

$regex="/[a-zA-Z]/”;
echo preg_match($regex,’StringToMatch’);

მაგრამ ეს პატერნი ერგებოდა როგორც მაგალითად StringToMatch სტრიქონს, ისე asdf1234. asdf45fg67-საც.. და საერთოდ neb1$mier_texts.

საქმე იმაშია, რომ preg_match ფუნქცია აბრუნებს 1-ს იმ შემთხვევაშიც, თუ ერთხელ მაინც შეხვდა სადმე პატერნის შესაბამისი ტექსტი. თუ გვინდა რომ მთელს სტრიქონზე იმუშაოს, მაშინ უნდა ჩავამატოთ დასაწყისის (^) და დასასრულის ($) აღმნიშვნელი სიმბოლოები. ანუ გამოსახულებას უნდა ჰქონდეს სახე:
$regex="/^[a-zA-Z]$/”;

დოკუმენტაციის წაკითხვა უნდოდა დაკვირვებით… :blush2: