Thứ Sáu, 25 tháng 1, 2013

Căn Bản PHP

Hiện nay nó khá nhiều ngôn ngữ viết web như asp,perl,php.... Mình định viết tất cả cho mọi người.Bài đầu tiên mình viết căn bản về lập trình PHP.Đây là 1 ngôn ngữ khá phổ biến.Rất nhiều mã nguồn đc viết bằng php.Bao nhiêu phần trăm thì mình không rõ.Nhưng đa số là php rồi.

Để chạy đc file php thì mọi người có khá nhiều cách,cài localhost ,hay kiếm 1 cái host nào đấy,vất lên là chạy thôi.

Bài 1.
Chương trình php đầu tiên :
Php có thể dễ dàng chèn vào nội dung của file html,hoặc có thể sinh ra mã html luôn

Mình lấy 1 ví dụ


<html>

<title>vhbgroup family</title>
</html>
<body>
    <?php
        echo "đây là mã php đầu tiên của chúng ta";
    ?>
</body>
</html>

lưu lại demo.php cho lên host ta sẽ nhận đc --->đây là mã php đầu tiên của chúng ta
Có thêm 1 số cách khai báo mã php
ví dụ như dạng script
<script language ="php">
        echo "đây là mã php đầu tiên của chúng ta";
  </script>

hay dạng không định thức
<?
echo "đây là mã php đầu tiên của chúng ta";
?>
Để in ra cái gì đó thì ta dùng lệnh echo,print. (bởi vì ngôn ngữ php nó khá tương đồng với C nên ở đây chơi đc luôn print.Chúng ta sẽ bắt gặp khá nhiều sự tương đồng ở đây,ví dụ như khi ghi chú chẳng hạn
có thể dùng # trong perl hoặc // trong C#         /* */ trong C++




Bài 2:
Khai báo biến trong php

Khi báo biến trong php giống với trong perl
ta dùng cú pháp
$tênbiến = giá trị
tênbiến ở đây có 1 số qui tắt như là bao gồm các chữ nằm rong bản chữ cái,ko bắt đầu bằng số và có phân biệt chứ hoa và chữ thường trong đó.

ví dụ
$username="Administrator".
Nói đến biến thì nói đến khai báo hằng số luôn
ta lấy 1 ví dụ
<?php
define("max",20);
print max;
?>

Kiểu dữ liệu trong php cũng tương tự như trong các ngôn ngữ khác,C chẳng hạn
có bool ,integer,double,string,object...v..v
nhưng khác với trong C khi ta đặt tên biến thì ta thường phải khai báo kiểu,trong php nó tự hiểu.
Để convert từ kiểu này sang kiểu khác ta dùng settype
ví dụ
$Count = 10.1;
settype($Count,"integer");
echo $Count;
ta sẽ nhận đc kết quả là -->10

Đôi khi ta không chủ ý convert nhưng nó vẫn convert cho ta
ví dụ nếu
 $Count =10;
$Count=$Count +10.1;
echo $Count ;
thì kết quả nhận đc sẽ là 20.1 mặc dù kiểu lúc đầu nó là integer.
Hay hàm round() ,hàm này sẽ làm tròn số cho ta

<?php
$Bien =4.133333333333333333;
$bien=round($Bien,2);//làm tròn với 2 chữ số
echo $bien;
?>

Cho kết quả là -->4.13

Ta nói thêm sơ sơ qua về kiểu dữ liệu nữa.Một số kiểu hay dùng như string chẳng hạn

Để nối string trong php ta dùng đơn giản như sau
$str1 ="vhbgroup";
$str2="family";
$str3=$str1.$str2;
echo $str3;
trong perl ta cũng có thể làm như vậy .Có điểm đặc biệt là ta có thể đặt biến vào 1 string
Cho 2 ví dụ sau để thấy sự thú vị
$str ="vhb";
$str2="Welcome to $str";
$str3='Welcome to $str';
echo $str2;
echo "</br>";//chỗ này sinh ra html như ta nói ở trên nhé.
echo $str3;
kết quả cho ra là

Welcome to vhb
Welcome to $str
Do sự khác biệt giữa dấu nháy đơn và kép,trong kép thì nó cho thay thế,trong nháy đơn,thì mình viết gì nó in ra vậy.
Một số trường hợp đặc biệt.
Cho phép viết 1 chuỗi dài trên diều dòng
$str =<<<EOD
lao dong hang say
hạn chế quay tay
tình yêu sẽ đến
EOD;
echo $str;
kết quả nó sẽ cho ta là  --->lao dong hang say hạn chế quay tay tình yêu sẽ đến

Biến Mảng.

để khai báo 1 biến là 1 mảng trong php ta khai báo như sau

<?php
$bien = array("vhb","family");
print $bien[0];
print "<br>";
print $bien[1];
?>

kết quả sẽ cho ta là
 --->    vhb
            family

như ta thấy mảng trong php được đánh từ 0
Mảng trong perl thì kiếu hiểu @tênbiếnmảng và cũng được đánh dấu từ 0.

Trong lập trình,khi nói đến mảng ta thường nhớ đến các bài sắp xếp.Ngoài tư duy dùng các thuật toán để sắp xếp như các ngôn ngữ khác,trong php còn hỗ trợ sẵn một số hàm
như soft

ví dụ:


$mang = array(1,2,5,4);
print $mang[2];
sort($mang);
print $mang[2];

kết quả nó in ra hai số là 5 và 4 ,ta thấy vị trí nó đã đc thay đổi.Tất nhiên nói để biết thôi chứ ai lại sắp kiểu củ chuối này đúng ko.

Bài 3:Cấu trúc điều khiển
câu lệnh IF
câu lệnh SWITCH ...CASE
câu lệnh FOR
câu lệnh FOREACH
câu lệnh WHILE
câu lệnh DO...WHILE

Ta cho ví dụ đơn giản về câu lệnh IF



<?php
$id1=1;
$id2=2;
if($id1 >$id2)
print $id1.">".$id2;
else print $id1." < ".$id2;
?>
kết quả in ra 1 < 2
đây là mẫu rất đơn giản,và ta có thể lồng nhiều câu if lại với nhau
như sau



if($a == $b) {
// do something
} elseif ($a > $b) {
// do something else
} elseif($a < $b) {
// do  something else
} else {
// if nothing else we do this..ok baby.
}


Ví dụ về câu lệnh SWITCH...CASE


<?php
$id= 2;
switch($id)
{
case 0: echo "bien id có giá trị là 0";break;
case 1: echo "bien id có giá trị là 1";break;
case 2: echo "bien id có giá trị la 2";break;
default :echo "bien id co gia tri khác 0,1,2";break;
}
?>


break - là câu lệnh dùng để thoát ra khỏi câu lệnh điều khiển,như thoát vòng lặp chẳng hạn.

Ví dụ về câu lệnh FOR

vòng for có dạng là for (biểu thức 1;biểu thức 2;biểu thức 3) { tập lệnh thực hiện} ;

trong đó
biểu thức 1 : thực hiện câu lệnh này đầu tiên khi vào vòng for và chỉ thực hiện 1 lần.
biểu thức 2 : Đây là điều kiện để vòng lặp diễn ra,nếu điều kiện này ko thỏa mãn thì vòng lặp kết thúc.
biểu thức 3 : Câu lệnh trong biểu thức này đc thực hiện sau mỗi vòng lặp

ví dụ: Bài tính tổng 10 số tự nhiên liên tiếp bắt đầu từ 1 nhá:


<?php
$id= 2;
$tong = 0;
for( $i = 0; $i <10; $i++)
{
$tong += $i; //tương đương với $tong = $tong +$i
}
echo $tong;
?>

kết quả đưa ra là -->45

ví dụ cho foreach tính tổng (1 ,3,5,7)



<?php
$array1 = array(1,3,5,7);
$tong =0;
foreach ($array1 as $value) //các giá trị của mảng array1 đc đưa vào biến $value ,từng giá trị //một
{
$tong += $value;
}
echo $tong;
?>


kết quả nhận đc là -->16

Ví dụ cho dùng vòng lặp WHILE


<?php
$value = 1;
$limit = 20;
$total = 0;
while ($total <$limit)
{
$total += $value;
}
echo $total;
?>

kết quả cho ra tất nhiên là 20 rồi ^^

Vi dụ cho DO....WHILE:


câu lệnh này khi vừa vào sẽ thực hiện tập câu lệnh trong khối DO trước rồi mới kiểm tra điều kiện.Nếu điều kiện đúng thì thực hiện lần thứ 2,nếu sai thì thoát luôn nhá.Chú ý cuối khối WHILE có dấu kết thúc lệnh nữa.



<?php
$value = 10;
$total = 0;
do
{
$total +=$value;
}
while ($total < 0);
echo $total ;
?>

kết quả cho ra là --->10
ta thấy dù điều kiện ở đây $total < 0 là sai nhưng nó vẫn thực hiện khối DO 1 lần rồi mới thoát.


Bài 4 : FUNCTION (Hàm)

Cấu trúc hàm mô tả như sau
function tên_hàm (tham số ở đây,có thể có hoặc ko)
{
      khối lệnh trong hàm;
      return value; //nếu trả về là một kiểu xác định.Nếu ko có return mặc định sẽ trả về kiểu null.
}

ví dụ về một hàm đơn giản nhất (tính tổng 2 số đã cho)



<?php
function total($a,$b)
{
return $a+$b;
}
echo total(3,4);
?>
kết qyar cho là ---->7

Bây giờ ta so sánh 2 đoạn code sau
đoạn 1

<?php
function total($a,$b)
$a +=1;
return $a+$b;
}
$a = 3;
echo total($a,4);
echo "<br>";
echo $a;
?>
đoạn này cho ra kết quả là---> 8 và 3

đoạn 2


<?php
function total(&$a,$b)  // chú ý có kí tự & trước biến $a nha.
{
$a +=1;
return $a+$b;
}
$a = 3;
echo total($a,4);
echo "<br>";
echo $a;
?>



kết quả opwr đây nhận đc là ---> 8 và 4
ta thấy biến $a trường hợp 1 ta thay đổi nó trong hàm,nhưng ở ngoài hàm nó ko thay đổi theo (ở đây ta chỉ dùng kiểu tham trị đến tham số của hàm.còn ở trường hợp 2 khi ta tác động lên biến trong hàm,thì giá trị ở ngoài hàm nó cũng thay đổi theo.Ở đây ta tham chiếu đến tham số của hàm (thêm & trước tham số).Như con trỏ trong C vậy.Cũng ko quá khó hiểu đúng ko nào.
hoặc ta cũng còn một cách nữa để mọi hoạt động trong hàm đối với biến,gây ra ảnh hưởng ở ngoài hàm bằng cách khai báo phạm vi biến global cho biến ở trong hàm.Xét ví dụ sau đây:


<?php
$a =3 ;$b=4;
function total($a,$b)
{
global $a,$b;
$a++;
return $a+$b;
}
echo total($a,4);
echo "<br>";
echo $a;
?>
Kết quả cho ra là --> 8 và 4
 ta thấy phạm vi hoạt động của biến $a ở trong và ngoài hàm là như nhau,mọi thay đổi trong dám đều dẫn đến thay đổi ngoài hàm.

Bài 5: Class

Cấu trúc của classs đc mô tả như sau"
<?php
class tên_class ()
{
     các phương thức ,thuộc tính;
}
$đối_tượng = new tên_class()
?>
Ta nói thêm về khai báo cho các phương thức và thuộc tính trong classs
static:khai báo tĩnh
public: khai báo toàn miền
private:khai báo dùng chỉ trong class
protected:khai báo dẫn xuất ,chúng ta chỉ có thể truy cập đến thuộc tính ,phương thức trong class hoặc ở class kế thừa thừa từ class này.
abstract: trừu tượng.
final:khai báo phương thức ko thể nạp chồng (cho class ko thể kế thừa)

......................

sau đây ta cho một ví dụ về class nhé.Trước giờ khi đọc lập trình mình toàn thấy người ta ví dụ về lớp con mèo =)).Ngôn ngữ nào họ cũng cho ví dụ về nó.Mình lấy ví dụ về một đối tượng là một tập hợp các phép tính toán,gồm cộng trừ nhân chia nhé.

xem xét kịch bản php sau:

<html>
 <title>vhbgroup family</title>
 </html>
 <body>
<?php
class pheptinh
{
private $so_a;
private $so_b;
function pheptinh ($a,$b)
{
$this->so_a=$a;
 $this->so_b=$b;
}
public function phep_cong()
{ return $this->so_a + $this->so_b; }
 public function phep_tru()
{ return $this->so_a - $this->so_b; }
 public function phep_nhan()
 { return $this->so_a * $this->so_b; }
 public function phep_chia()
{ return $this->so_a / $this->so_b; }
}
?>
<?php
$doi_tuong = new pheptinh(3,4); echo $doi_tuong->phep_cong(); echo "<br>"; echo $doi_tuong ->phep_nhan();
?>
</body>
</html>

kết quả cho ra là ---> 7   và  12 .
ta xem xét ở đây

ví 2 thuộc tính  $so_a và $so_b ta chỉ dùng trong class này,ko muốn dùng thêm ở đâu cả nên ta khai báo chúng là private.Còn các phương thức ta muốn dùng ở mọi nơi,chỗ nào cũng có thể gọi đc chúng nên ta khai báo là public.

đoạn

function pheptinh ($a,$b)
{
$this->so_a=$a;
$this->so_b=$b;
}
là đoạn ta khởi tạo ,hay còn gọi nó là hàm constructor.Ta set giá trị cho 2 thuộc tính ban đâu của ta.
Dùng từ khóa "$this->tên_thuộc_tính" để truy cập đến thuộc tính của nó,tương tự khi ta muốn truy cập đến 1 phương thức thì ta cũng dùng dấu -> để truy cập từ 1 đối tượng nào đó.

Mình viết đến đây chỉ là viết căn bản nhất ,tạo cái hình dung về lập trình php thôi.Các bài tiếp sau sẽ nói thêm 1 số điểm hay gặp trong php.

Bài 6:Kế thừa trong hướng đối tượng.


Đôi khi ta cần 1 class mới,nhưng có sử dụng các thuộc tính và phương thức trong class cũ,Việc viết lại class thật là mất thời gian,nên người ta tạo ra tính năng kế thừa của class.Sau đây là 1 ví dụ về kế thừa.Để kế thứa người ta dùng từ khóa extends .

lấy lại class ở trên nhé


<?php
class pheptinh
{
protected $so_a;
protected $so_b;
function pheptinh ($a,$b)
{
  $this->so_a=$a;
  $this->so_b=$b;
}
public function phep_cong()
{ return $this->so_a + $this->so_b; }

public function phep_tru()
{ return $this->so_a - $this->so_b; }

public function phep_nhan()

 { return $this->so_a * $this->so_b; }

public function phep_chia()
{ return $this->so_a / $this->so_b; }
}
  class pheptinhfull  extends pheptinh
  {
    private $tong =1;
    public function phepluythua()
    {
        for($i = 0;$i <$this->so_b;$i++)
        {
            $this->tong *= $this->so_a;
        }
        return $this->tong;
    }
    
  }
  
  $obj = new pheptinhfull(3,3);
  echo $obj->phepluythua();
?>
  kết quả nhận đc là  -->27
vì ta lấy lũy thừa 3 của 3 mà.
chú ý đoạn code đầu đc sửa ở chỗ
protected $so_a;
protected $so_b;

lúc đầu ta khai báo là private những sau là protected vì ta muốn ở lớp kế thừa sử dụng lại thuộc tính này.
Và đối tượng mới đc tạo ra từ class pheptinhfull sẽ có đủ các chức năng class pheptinh thực hiện,đồng thời thực hiện các chức năng mới.Và ta ko hề tốn sức đi xây dựng lại.

Bài 6:Vài vấn đề trong php

1.Vấn đề 1.(__toString):
Giả sử đôi lúc ta viết là 
echo $obj;
trong khi object trên nó ko hề return về một string.điều gì sẽ xảy ra.Tất nhiên nó sẽ báo lỗi.Vậy ta làm sao để nó không báo lỗi.Trên thực tế ta không cần phải làm điều này.Nhưng biết càng nhiều càng tốt đúng ko.Để giải quyết vấn đề này ta viết thêm 1 phương thức __toString() trong class.Một khi ta echo $obj ra thì nó sẽ trả về chuỗi trong _toString().Xem ví dụ sau.

<?php
/**
 * @author capuchino
 * @copyright 2013
 */
class VHB
{
    private $str = "welcome to vhbgroup";
    public function __toString()
    {
        return $this->str;
    }
}
$ohj = new VHB;
echo $ohj;
?>

kết quả in ra là -->  welcome to vhbgroup

2.Vấn đề 2 ( __autoload)
tạo 1 file lưu với tên autoload.php với nội dung như sau.

<?php
class AUTOLOAD
{
public function vhb()
{
return "welcome to vhbgroup";
}
}
?>
 tiếp theo tạo một file khác ví dụ là demo.php với nội dung như sau


<?php
function __autoload($url)
{
require("$url.php");
}
$obj = new AUTOLOAD;
echo $obj->vhb();
?>

ta thấy ko hề có class nào tên là AUTOLOAD trong file demo.php cả,nhưng nó vẫn gọi đc.Giả sử ta bỏ đi thủ tục function __autoload() rồi cho chạy lại file demo.php thì kết quả nhận đc là lỗi.vì thực tế nó ko thể đọc đc phương thức trong class AUTOLOAD,hay nói cách khác là ko đọc đc class AUTOLOAD.Việc thêm __autoload() nó có tác dụng khi vừa khởi tạo 1 đối tượng,nó sẽ tự động load file (ở đây tên lớp phải trùng tên file nha) có tên là class cái mà đối tượng đc khởi tạo.Ở đây nó tự động lấy tên AUTOLOAD ở chỗ
$obj = new AUTOLOAD rồi xem đó là tham số gán vào biến $url rồi dùng require() để gọi file (class) đó.



Không có nhận xét nào:

Đăng nhận xét