Thursday, December 27, 2007

PHP Advanced Tutorials Collection

Php advanced tutorials collection . tutorials about ajax , zend framework , widgets , how to write a search engine with php , caching with php and more .

read more | digg story

Tuesday, September 18, 2007

Object Oriented Programming in PHP: The Way to Large PHP Projects

This arcticle introduces Object Oriented Programming (OOP) in PHP. I will show you how to code less and better by using some OOP concepts and PHP tricks. Good luck!
Concepts of object oriented programming: There're differences between authors, I can mention that a OOP language must have:
  • Abstract data types and information hidding
  • Inheritance
  • Polymorphism
The encapsulation is done in php using classes:


class Something {
// In OOP classes are usually named starting with a cap letter.
var $x;

function
setX($v) {
// Methods start in lowercase then use lowercase to seprate
// words in the method name example getValueOfArea()
$this->x=$v;
}

function
getX() {
return
$this->x;
}
}

?>
Of course you can use your own nomenclature, but having a standarized one is useful.
Data members are defined in php using a "var" declaration inside the class, data members have no type until they are assigned a value. A data member might be an integer, an array, an associative array or even an object. Methods are defined as functions inside the class, to access data members inside the methods you have to use $this->name, otherwise the variable is local to the method.
You create an object using the new operator:
$obj=new Something;
Then you can use member functions by:
$obj->setX(5);
$see=$obj->getX();
The setX member function assigns 5 to the x datamember in the object obj (not in the class), then getX returns its value: 5 in this case.
You can access the datamembers from the object reference using for example: $obj->x=6; however, this is not a very good OOP practice. I enforce you to set datamembers by defining methods to set them and access the datamembers by using retrieving methods. You'll be a good OOP programmer if you consider data members inaccesible and only use methods from the object handler. Unfortunately PHP doesn't have a way to declare a data member private so bad code is allowed.
Inheritance is easy in php using the extend keyword.


class Another extends Something {
var
$y;
function
setY($v) {
// Methods start in lowercase then use lowercase to seperate
// words in the method name example getValueOfArea()
$this->y=$v;
}

function
getY() {
return
$this->y;
}
}

?>
Objects of the class "Another" now has all the data members and methods of the parent class (Something) plus its own data members and methods. You can use:
$obj2=new Something;
$obj2->setX(6);
$obj2->setY(7);
Multiple inheritance is not supported so you can't make a class extend two or more different classes.
You can override a method in the derived class by redefining it, if we redefine getX in "Another" we can't no longer access method getX in "Something". If you declare a data member in a derived class with the same name as a data member in a Base class the derived data member "hides" the base class data member when you access it.
You might define constructors in your classes, constructors are methods with the same name as the class and are called when you create an object of the class for example:


class Something {
var
$x;

function
Something($y) {
$this->x=$y;
}

function
setX($v) {
$this->x=$v;
}

function
getX() {
return
$this->x;
}
}

?>
So you can create an object by:
$obj=new Something(6);
And the constructor automatically asigns 6 to the data member x. Constructors and methods are normal php functions so you can use default arguments.
function Something($x="3",$y="5")
Then:
$obj=new Something();    // x=3 and y=5
$obj=new Something(8); // x=8 and y=5

When an object of a derived class is created only its constructor is called, the constructor of the Parent class is not called, this is a gotcha of PHP because constructor chaining is a classic feature of OOP, if you want to call the base class constructor you have to do it explicitely from the derived class constructor.It works because all methods of the parent class are available at the derived class due to inheritance.


function Another() {
$this->y=5;
$this->Something(); //explicit call to base class constructor.
}

?>
A nice mechanism in OOP is to use Abstract Classes, abstract classes are classes that are not instanciable and has the only purpose to define an interface for its derived classes. Designers often use Abstract classes to force programmers to derive classes from certain base classes so they can be certain that the new classes have some desired functionality. There's no standard way to do that in PHP but:
If you do need this feature define the base class and put a "die" call in its constructor so you can be sure that the base class is not instanciable, now define the methods (interface) putting "die" statements in each one, so if in a derived class a programmer doesn't override the method then an error raises. Furthermore you might need to be sure since php has no types that some object is from a class derived from you base class, then add a method in the base class to identify the class (return "some id"), and verify this when you receive an object as an argument. Of course this doesn't work if the evil programmer oveerides the method in the derived class but genrally the problem is dealing with lazy programmers no evil ones! Of course is better to keep the base class unreachable from the programmers, just print the interface and make them work!
There're no destructors in PHP.

$obj=new Something(8,9); // x=8 and y=9
Default arguments are used in the C++ way so you can't pass a value to Y and let X take the default value, arguments are asigned form left to right and when no more arguments are found if the function expected more they take the default values.

Overloading (which is different from overriding) is not supported in PHP. In OOP you "overload" a method when you define two/more methods with the same name but different number or type of parameters (depending upon the language). Php is a loosely typed language so overloading by types won't work, however overloading by number of parameters doesn't work either.
It's very nice sometimes in OOP to overload constructors so you can build the object in different ways (passing different number of arguments). A trick to do something like that in PHP is:


class Myclass {
function
Myclass() {
$name="Myclass".func_num_args();
$this->$name();
//Note that $this->$name() is usually wrong but here
//$name is a string with the name of the method to call.
}

function
Myclass1($x) {
code;
}
function
Myclass2($x,$y) {
code;
}
}

?>
With this extra working in the class the use of the class is transparent to the user:
$obj1=new Myclass('1');      //Will call Myclass1
$obj2=new Myclass('1','2'); //Will call Myclass2
Sometimes this is very nice.

Polymorphism
Polymorphism is defined as the ability of an object to determine which method to invoke for an object passed as argument in runtime time. For example if you have a class figure which defines a method draw and derived classes circle and rectangle where you override the method draw you might have a function which expects an argument x and then call $x->draw(). If you have polymorphism the method draw called depends of the type of object you pass to the function. Polymorphism is very easy and natural in interpreted languages as PHP (try to imagine a C++ compiler generating code for this case, which method do you call? You don't know yet which type of object you have!, ok this is not the point). So PHP happily supports polymorphism.


function niceDrawing($x) {
//Supose this is a method of the class Board.
$x->draw();
}

$obj=new Circle(3,187);
$obj2=new Rectangle(4,5);

$board->niceDrawing($obj); //will call the draw method of Circle.
$board->niceDrawing($obj2); //will call the draw method of Rectangle.

?>
OOP Programming in PHP
Some "purists" will say PHP is not truly an object oriented language, which is true. PHP is a hybrid language where you can use OOP and traditional procedural programming. For large projects, however, you might want/need(?) to use "pure" OOP in PHP declaring classes, and using only objects and classes for your project. As larger and larger projects emerge the use of OOP may help, OOP code is easy to mantain, easy to understand and easy to reuse. Those are the foundations of software engineering. Applying those concepts to web based projects is the key to success in future web sites.
Advanced OOP Techniques in PHP
After reviewing the basic concepts of OOP I can show you some more advanced techniques:
Serializing
PHP doesn't support persistent objects, in OOP persistent objects are objects that keep its state and funcionality across multiple invocations of the application, this means having the ability of saving the object to a file or database and then loading the object back. The mechanism is known as serialization. PHP has a serialize method which can be called for objects, the serialize method returns a string representation of the object. However serialize saves the datamembers of the object but not the methods.
In PHP4 if you serialize the object to string $s, then destroy the object, and then unserialize the object to $obj you might still access the object methods! I don't recommend this because (a) The documentation doesn't guarrantee this beahaviour so in future versions it might not work. (b) This might lead to 'illusions' if you save the serialized version to disk and exit the script. In future runs of the script you can't unserialize the string to an object an expect the methods to be there because the string representation doesn't have the methods! Summarizing serializing in PHP is VERY useful to save the data members of an object just that. (You can serialize asociative arrays and arrays to save them to disk too).
Example:


$obj
=new Classfoo();
$str=serialize($obj);
// Save $str to disk

//...some months later

//Load str from disk
$obj2=unserialize($str)

?>
You have the datamembers recovered but not the methods (according to the documentation). This leads to $obj2->x as the only way to access the data members (you have no methods!) so don't try this at home.
There're some ways to fix the problem, I leave it up to you because they are too dirty for this neat article.
Full serialization is a feature I'd gladly welcome in PHP.


Why PHP 5 Rocks!

PHP 5, which was released earlier this week, is the first major release of PHP in years to focus on new features.

While one of the key goals behind PHP 3 was increasing PHP/FI 2.0's performance and efficiency, at the same time it introduced a whole new set of functionality.

That was back in 1998.

PHP 4 provided another speed burst, as it introduced the Zend Engine. However, the majority of PHP 4's changes were behind the scenes. Those features allowed more people than ever to use PHP, but it didn't provide them with more tools to build their sites.

Finally, after six years, the community has revisited the legacy baggage that made tackling some problems unnecessarily difficult.

In particular, PHP 4's version of object-oriented programming (OOP) lacks many features, the MySQL extension doesn't support the new MySQL 4.1 client protocol, and XML support is a hodgepodge.

Fortunately, PHP 5 improves on PHP 4 in three major areas:

  • Object-oriented programming
  • MySQL
  • XML

These items have all been completely rewritten, turning them from limitations into star attractions. While these changes alone warrant a new version of PHP, PHP 5 also provides a plethora of other new features.

In this article, I highlight seven of my favorite PHP 5 features. These features allow your PHP 5 code to frequently be shorter, more elegant, and more flexible than ever before.

1. Robust Support for Object-Oriented Programming

Ever since Zeev and Andi's late-night OOP hack, PHP programmers have clamored for an increasing amount of OO features. However, neither PHP 3 nor PHP 4 truly incorporates objects into its core.

With PHP 5, PHP programmers can at last stop apologizing for PHP's krufty OO support. It offers:

  • Constructors
  • Destructors
  • Public, protected, and private properties and methods
  • Interfaces
  • Abstract classes
  • Class type hints
  • Static properties and methods
  • Final properties and methods
  • A whole suite of magical methods

Additionally, objects are now both assigned--and passed--by reference instead of by value, so the necessity to liberally sprinkle ampersands throughout your code is no more.

If you're a person who enjoys web programming using objects and patterns, then these features alone will make your year. However, PHP 5's just getting started.

2. A Completely Rewritten MySQL Extension

The MySQL database is PHP's partner in crime. Many developers power their web sites with MySQL, yet the MySQL extension is showing its age. In retrospect, some design decisions weren't the best solutions after all.

Also, the latest versions of MySQL, 4.1 and 5.0, introduce many new features, some of which require significant changes to the extension. As a result, PHP 5 comes with a completely new and improved MySQL extension. Dubbed MySQLi, for MySQL Improved. It offers:

  • Prepared statements
  • Bound input and output parameters
  • SSL connections
  • Multi-query functions

MySQLi even takes advantage of PHP 5's new object-oriented support to provide an OO interface to MySQL. On top of that, the latest versions of MySQL now enable subselects, transactions, and replication.

3. A Suite of Interoperable XML Tools

PHP 5 fixes the major problems in PHP 4's XML extensions. While PHP 4 allows you to manipulate XML, its XML tools are only superficially related. Each tool covers one part of the XML experience, but they weren't designed to work together, and PHP 4 support for the more advanced XML features is often patchy.

Not so in PHP 5.

The new XML extensions:

  • Work together as a unified whole.
  • Are standardized on a single XML library: libxml2.
  • Fully comply with W3 specifications.
  • Efficiently process data.
  • Provide you with the right XML tool for your job.

Additionally, following the PHP tenet that creating web applications should be easy, there's a new XML extension that makes it simple to read and alter XML documents. The aptly named SimpleXML extension allows you to interact with the information in an XML document as though these pieces of information are arrays and objects, iterating through them with for-each loops, and editing them in place merely by assigning new values to variables.

In short, SimpleXML kicks ass!

If you know the document's format ahead of time, such as when you're parsing RSS files, REST results, and configuration data, SimpleXML is the way to go.

And if you're a DOM fan, you'll be pleasantly surprised with PHP 5's DOM extension, which is light-years beyond what you're using in PHP 4.

4. An Embedded Database with SQLite

While MySQL is greater than ever, it's actually "too much database" for some jobs. SQLite is an embedded database library that lets you store and query data using an SQL interface without the overhead of installing and running a separate database application.

When your application needs a server-side storage mechanism but you can't rely upon the presence of a specific database, turn to SQLite. It correctly handles locking and concurrent accesses, the two big headaches with homebrewed flat files.

PHP 5 bundles SQLite, providing developers with a database that's guaranteed to work on all PHP 5 installations. Despite the name, SQLite is nowhere close to a "lite" database. It supports:

  • Transactions
  • Subqueries
  • Triggers
  • And many other advanced database features

You can even write user-defined functions in PHP and call them from within SQLite. This is by far and away the coolest feature available in any PHP database extension.

5. Cleaner Error Handling with Exceptions

PHP 5 offers a completely different model of error checking than what's available in PHP 4. It's called exception handling. With exceptions, you're freed from the necessity of checking the return value of every function. Instead, you can separate programming logic from error handling and place them in adjoining blocks of code.

Exceptions are commonly found in object-oriented languages such as Java and C++. When used judiciously, they streamline code, but when used willy-nilly, they create spaghetti code.

Right now, only a few PHP extensions use exceptions, but they're slowly being phased in. However, they're available today for any PHP code you write.

6. A First-Class SOAP Implementation

SOAP is a key component of the fast-growing web services field. This extension lets developers create SOAP clients with or without a Web Services Description Language (WSDL) file, and also implement SOAP servers in PHP.

PHP 4's SOAP support is only fair. While there are a few SOAP packages, the most mature ones are written in PHP instead of C. Therefore, they are slow, and you have to download and install them yourself.

With PHP 5, there's finally a usable SOAP extension written in C. Currently, this extension implements most, but not all, of SOAP 1.2. This is a significant improvement over previous C extension, and future pieces will be added in time.

Particularly in comparison with .NET and Java, PHP's SOAP support has always lagged behind the curve. Whether you love or hate SOAP, PHP needs to offer a first-class SOAP extension, and I'm excited to finally see some momentum in this direction.

7. Iterators

Iterators are a completely new PHP 5 feature. They allow you to use a for-each loop to cycle through different types of data: directory listings, database results, and even XML documents. SPL -- Standard PHP Library -- is a collection of iterators that provide this functionality and also filter, limit, cache, and otherwise modify iterator results.

Iterators are an incredibly handy way to abstract away messy details from your code.

For example, the DirectoryIterator turns directory iteration from this:


$dir = opendir($path);
while (false !== ($file = readdir($dir))) {
print "$file\n";
}
closedir($dir);

Into this:


foreach (new DirectoryIterator($path) as $file) {
print "$file\n";
}

There are no directory handles to mess about with, nor ugly conditions to check inside a while loop.

These are my top seven favorite features of PHP 5, but they're by no means the only ones. Besides what I've already highlighted, PHP 5 also offers:

  • Enhanced streams, wrappers, and filters.

    First introduced in PHP 4.3, streams are an underutilized part of PHP. They allow you to place a file interface on reading and writing data using protocol-specific objects known as wrappers. Streams also let you modify the data flowing through them by attaching filters.

  • Code introspection using the Reflection classes.

    This set of classes lets you examine classes, methods, parameters, and more, to discover object attributes. It is now simple and easy to create PHP class browsers, debuggers, and other tools that rely on gathering details about objects and functions.

  • Compliant HTML output thanks to Tidy.

    The Tidy extension makes it easy to ensure that your output is valid HTML and XHTML. Its smart parser brings even the most unruly of files into compliance with the latest W3C specifications.

  • Superior command-line processing.

    The PHP5 command-line version now allows individual line processing, similar to Perl and awk. You can specify code to be run at the beginning, on, and at the end of each line in a file.

I hope you've found this quick tour around PHP 5 useful. As you can see, PHP 5 is leaps and bounds better than before. I'm sure you'll find all sorts of cool ways to incorporate its features into your programs.

Adam Trachtenberg is the manager of technical evangelism for eBay and is the author of two O'Reilly books, "Upgrading to PHP 5" and "PHP Cookbook." In February he will be speaking at Web Services Edge 2005 on "Developing E-Commerce Applications with Web Services" and at the O'Reilly booth at LinuxWorld on "Writing eBay Web Services Applications with PHP 5."

Tuesday, September 11, 2007

5 tools every PHP programmer should know about

After working on several large scale PHP projects, and writing a lot of PHP code, I’ve discovered a number of tools that improve code quality, streamline rollouts, and generally make life as a PHP developer a whole lot easier. Many of these tools probably deserve a post of their own. But, since some people aren’t even aware that these tools exist, I figured I’d start there. So, without further ado, here’s my list of tools that every PHP programmer should know about.

Phing - a project build system

Phing LogoPhing is a project build system based on Apache ANT. The name is a recursive acronym, of sorts, that stands for PHing Is Not GNU make. Phing can do anything a traditional build system like GNU make can do, but without the steep learning curve.

The idea behind phing (and other build tools) is to evaluate a set of dependencies, then execute a set of PHP classes to properly install and configure an application. The build process is controlled by a simple XML configuration file. Out of the box, phing can perform token replacement (e.g., to change include paths on your development and production systems), execute SQL, move and copy files, run shell scripts, and more. You can also create your own custom tasks by extending the “task” class included with the package.

Phing is an invaluable tool for anyone who needs to deploy large scale PHP applications on more than a single server. But I’ve found it useful for simple scripts, too.

Xdebug - debugger and profiler tool

Xdebug LogoXdebug is a PHP extension that helps you debug and profile scripts. Among the most useful features of Xdebug are the new notice, warning, and error messages that are displayed after activation. If a script fails to execute properly, Xdebug will print a full stack trace in the error message, along with function names, parameter values, source files, and line numbers. A welcome feature for developers who are tired of the skimpy error reports from a default PHP install.

The extension has a number of more advanced features that allow developers to perform code coverage analysis, collect profiling information, and debug scripts interactively. The profiling functionality is particularly useful. The profiler uses a common output file format, allowing you to use tools like KCacheGrind to quickly find bottlenecks in your code. A good profiler is an essential tool for any serious developer, as it allows you to properly optimize your code while avoiding the hazards of premature optimization.

PHPUnit - unit testing framework

PHPUnit logoPHPUnit is a lightweight testing framework for PHP. It’s a complete port of JUnit 3.8.1 for PHP5, and is a member of the xUnit family of testing frameworks (which are based on a design by software patterns pioneer Kent Beck).

Unit tests form the foundation of several modern agile development methodologies, making PHPUnit a vital tool for many large scale PHP projects. The tool can also be used to generate code coverage reports using the Xdebug extension discussed earlier, and integrates with phing to automate testing.

Propel - object-relational mapping framework

Propel LogoPropel is an Object-Relational Mapping (ORM) framework for PHP5 that was originally based on the Apache Torque project. It provides a sophisticated, but easy to use database abstraction layer that allows you to work with database entities the same way you work with normal classes and objects in PHP. Propel allows you to define your database in a simple XML format which it uses to construct the database, and generate static classes for use in your application.

Propel is integrated into the popular Symfony PHP framework (among others), which has helped keep the code base flexible, modular, and portable. The project has excellent documentation, and a great support community.

phpMyAdmin / phpPgAdmin - web-based database administration

phpMyAdmin LogoAn oldy but a goody, phpMyAdmin is one of the most useful administrative tools available for any database (along with it’s PostgreSQL and SQLite cousins phpPgAdmin and phpSQLiteAdmin) . It’s useful for everything from constructing and altering databases to debugging applications and making backups. This is often the first thing I install after Apache, PHP and MySQL on a LAMP server. If you use MySQL, and somehow you haven’t heard of it, install it now.

Other Stuff

There are tons of excellent tools that fill all sorts of niches, and help provide a rich environment for PHP developers — I wish I could mention them all. A few more that I’ve found useful myself are PHP Beautifier, Spyc, Creole, and Smarty. I’m sure there are tons more that I either forgot, or have never heard of. So if you know of a great PHP development tool that I left out, please post a comment and let me (and everyone else) know about it!

Saturday, September 8, 2007

Hàm

Đây là một trong những thuận lợi nhất trong phát triển ứng dụng. Các hàm cho phép bạn phát triển việc sử dụng lại và dễ dàng chỉnh sửa các thành phần mà thật sự hữu ích khi bạn phát triển các ứng dụng Web tương tự như trong quan niệm và tiện ích. Các kết quả của hàm rất ngắn gọn, dễ hiểu và dễ đọc.
Vậy hàm là gì?
Hàm là một đoạn các mã lệnh với một mục đích cụ thể và phải được gán một tên duy nhất. Tên hàm có thể được gọi tại bất kỳ đâu trong chương trình, cho phép các đoạn mã thể hiện bởi tên của nó được thực hiện lặp lại khi cần thiết. Đây là một thuận lợi bởi cùng một đoạn mã lệnh chỉ được viết một lần nhưng có thể được chỉnh sửa dễ dàng khi cần thiết.
Tạo một hàm PHP là một quá trình đơn giản. Bạn có thể tạo một hàm tại bất kỳ nơi nào trong chương trình PHP. Tuy nhiên, cho mục đích tổ chức bạn có thể thấy rằng sự thuận lợi khi đặt tất cả các hàm được dự định sẽ sử dụng trong script tại đầu mỗi file script. Một phương thức khác cho việc tổ chức hàm mà có thể giảm đi sự dư thừa đáng kể và tăng việc sử dụng lại là đặt các hàm trong những file riêng rẽ( được xem như là một thư viện). Điều này là thuận lợi bởi bạn có thể dùng các hàm lặp đi lặp lại trong những ứng dụng khác nhau mà không tạo ra các việc copy dư thừa và do đó giảm bớt các nguy cơ gây lỗi do việc viết lại.
Một hàm thường bao gồm ba phần phân biệt:
+ Tên của hàm.
+ Cặp dấu ngoặc ( ) chứa các tham số tuỳ chọn nhập vào.
+ Phần thân của hàm,nằm trong cặp dấu { }.
Ví dụ khai báo một hàm sau:
function display_copyright($site_name) {

print "Copyright © 2000 $site_name. All Rights Reserved.";

}
Các hàm lồng nhau:
Các hàm có thể lồng nhau. Điều này thật sự hữu ích cho các chương trình lớn và nhỏ, khi nó thêm vào một mức độ modul hoá khác vào trong ứng dụng, kết quả sẽ tăng lên đáng kể trong việc quản lý mã.
Quay lại với ví dụ display_copyright ở trên, bạn có thể giới hạn nhu cầu chỉnh sửa ngày tháng cùng với việc dùng một hàm lồng định nghĩa trước của PHP trong hàm display_copyright():
function display_copyright($site_name) {

print "Copyright ©". date("Y"). " $site_name. All Rights Reserved.";

}
Bạn cũng có thể lồng các khai báo hàm trong một hàm khác. Tuy nhiên, việc lồng một khai báo hàm không ngụ ý rằng nó sẽ được bảo vệ trong phạm vi giới hạn mà nó được khai báo. Hơn thế nữa, một hàm được lồng vào không thừa kế các tham số nhập vào của “cha mẹ” nó, các tham số phải được chuyển sang hàm được lồng chỉ khi chúng được chuyển sang hàm khác. Tuy nhiên, việc lồng các khai báo hàm là thật sự hữu ích cho các lý do quản lý mã và đảm bảo sự rõ ràng của tổ chức mã.
Ví dụ:
function display_footer($site_name) {

function display_copyright($site_name) {

print "Copyright © ". date("Y"). " $site_name. All Rights Reserved.";

}

print "


home recipes events


tutorials about contact us
";

display_copyright($site_name);

print "
";

}

$site_name = "PHP Recipes";

display_footer($site_name);
Sau khi thực hiện,đoạn script trên sẽ cho kết quả như sau:
home recipes events

tutorials about contact us
Các hàm lồng nhau trong PHP không được bảo vệ bởi việc được gọi từ bất kỳ đoạn script nào trong chương trình, nhưng chúng không thể được gọi lại cho đến sau khi các hàm cha mẹ được gọi. Việc gọi thử một hàm lồng trước khi gọi hàm cha mẹ của nó sẽ sinh ra một thông báo lỗi.
Các giá trị trả về từ một hàm:
Việc trả về một giá trị từ hàm là rất hữu ích, nó được thực hiện bằng cách gán giá trị gọi hàm cho một biến. Bất kỳ kiểu dữ liệu nào cũng được trả về từ một hàm bao gồm cả kiểu mảng và danh sách.
Ví dụ: xây dựng một hàm tính thuế bán hàng
$price = 24.99;

$tax = .06;

function calculate_cost($tax, $price) {

$sales_tax = $tax;

return $price + ($price * $sales_tax);

}

// chú ý cách calculate_cost() trả lại một giá trị

$total_cost = calculate_cost ($tax, $price);

// làm tròn biến $total_cost có 2 dấu chấm thập phân.

$total_cost = round($total_cost, 2);

print "Total cost: ".$total_cost;

// $total_cost = 26.49
Hàm đệ quy:
Hoạt động của một hàm gọi lại bản thân chính nó nhiều lần để thoả mãn một vài phép toán thật sự là một sức mạnh. Nếu được sử dụng một cách đúng đắn, các việc gọi hàm đệ quy có thể tiết kiệm được khoảng trống không đáng và dư thừa trong một script và đặc biệt hữu ích cho việc thực hiện các thủ tục lặp đi lặp lại.
Ví dụ sử dụng một hàm lặp đệ quy để tính một tập hợp các số integer.
function summation ($count) {

if ($count != 0) :

return $count + summation($count− 1);

endif;

}

$sum = summation(10);

print "Summation = $sum";
Kết quả của đoạn mã trên sẽ là Summation=55
Sử dụng hàm đệ quy có thể cải thiện tốc độ trong một chương trình nếu hàm được gọi đủ thường xuyên.Tuy nhiên,phải cẩn thận khi viết các thủ tục đệ quy ,nếu mã không đúng sẽ dẫn đến việc lặp không dừng được.Các hàm có thể thay đổi:
Khả năng thú vị của PHP là có thể thực hiện các hàm có thể biến đổi được. Một hàm có khả năng thay đổi là một lời gọi “động” đến hàm mà tên của nó được xác định tại thời điểm thực thi. Mặc dầu không thật sự cần thiết trong hầu hết các ứng dụng Web, nhưng các hàm có thể thay đổi có thể giảm kích thước mã và độ phức tạp một cách đáng kể, thông thường loại bỏ các câu lệnh điều kiện if không cần thiết.
Ta có thể gọi hàm có thể thay đổi được bằng cách gọi tên một biến theo sau là tập các dấu ngoặc đơn( ). Trong dấu ngoặc đơn đó là tập các tham số tuỳ chọn nhập vào. Hình thức thông thường của một hàm có thể thay đổi như sau: $function_name();
Ví dụ :sử dụng hàm có thể thay đổi để xác định các biến nhập vào.
//thông điệp chào tiếng Italia

function italian() {

print "Benvenuti al PHP Recipes.";

}

// thông điệp chào tiếng Anh

function english() {

print "Welcome to PHP Recipes.";

}

// gán ngôn ngữ dùng là tiếng Italia

$language = "italian";

//thực thi hàm có thể thay đổi được.

$language();
Xây dựng các thư viện hàm:
Các thư viện hàm là một trong những cách hữu ích để tiết kiệm thời gian khi xây dựng các ứng dụng. Ví dụ, bạn có thể viết một loạt các hàm cho việc sắp xếp các mảng. Bạn có thể sử dụng lại các hàm này trong các ứng dụng khác nhau. Hơn là việc thường xuyên viết lại hay copy và dán các hàm này vào các script mới, nó thật sự tiện lợi khi đặt tất cả các hàm liên quan đến việc sắp xếp trong cùng một file phân biệt. File này sẽ chứa các tiêu đề dễ dàng nhận ra,chẳng hạn như array_sorting.inc. Ví dụ như sau:

Hàm thư viện array_sorting.inc này sẽ hoạt động như là một chỗ chứa cho tất cả các hàm sắp xếp mảng. Điều này thật sự hữu ích bởi bạn có thể tổ chức các hàm một cách hiệu quả theo mục đích cho phép dễ dàng tìm kiếm khi cần thiết. Một khi bạn xây dựng cho chính mình một thư viện hàm, bạn có thể sử dụng các câu lệnh include() và require() của PHP để chứa toàn bộ các file thư viện vào trong một script do đó làm cho tất cả các hàm đều có sẵn. Cú pháp chung của hai câu lệnh này như sau:
include(path/filename);

require(path/filename);
hay cũng có thể như sau:
include "path/filename";

require "path/filename";

"path":đường dẫn tuyệt đối hay tương đối của filename.
Giả sử bạn muốn dùng thư viện array_sorting.inc trong một script.Bạn có thể dễ dàng thực hiện như sau:
include ("array_sorting.inc");
Bây giờ thì bạn có thể dễ dàng sử dụng bất kỳ hàm nào trong array_sorting.inc
$some_array = (50, 42, 35, 46);

//sử dụng phương pháp sắp xếp bubble_sort( )

$sorted_array = bubble_sort($some_array, 1);

Cấu trúc điều khiển:

Các câu lệnh điều kiện: các câu lệnh này cho phép chúng ta phân biệt các khối mã lệnh mà sẽ được thực thi chỉ khi gặp phải các điệu kiện nào đó. PHP cung cấp hai cấu trúc lệnh điều kiện. Đầu tiên là if…elseif…else, cho phép chúng ta có thể kiểm tra một số lượng các biểu thức và thực thi các câu lệnh theo giá trị của chúng. Nếu chúng ta mong muốn kiểm tra một biểu thức đơn lẻ với một số lượng các giá trị, PHP cũng cung cấp một cấu trúc switch…case mà có thể làm đơn giản hoá đi phép toán này.
1)Câu lệnh If:
Câu lệnh If là một trong những đặc tính quan trọng nhất của mỗi ngôn ngữ lập trình. Nó cho phép thực thi chọn lựa các dòng mã lệnh chỉ khi thoả mãn các điều kiện cụ thể.Chẳng hạn:
if ($country=="ca")
echo ("Canada");//Canada được in ra khi biến $country là ca
Nếu nhiều hơn một câu lệnh được thực hiện khi thoã mãn điều kiện thì sử dụng dấu {} để chỉ ra những dòng lệnh nào là nằm trong khối if:
//Canada sẽ chỉ được in nếu biến $country là ca

if ($country=="ca"){

echo("Canada");

echo("Ottawa");

}
Điều kiện được kiểm tra trong dấu {}phải trả về giá trị Boolean, hoặc là true hoặc là false. Cũng như bất kỳ điều kiện nào mà không được thoã mãn, zero hay là chuỗi rỗng (”"), các giá trị không được định nghĩa thì tất cả đều trả về giá trị là false. Các điều kiện có thể được nối với nhau bằng các toán tử logic and (&&), or() và xor.Ví dụ như sau:
if (((4 <> 2)) xor (5 == 5))
echo ("This will not print");
Các điều kiện phân nhánh: Nếu điều kiện được kiểm tra mà trả về false, thì PHP cho phép ta chỉ ra một khối lệnh khác cần được thực hiện bằng cách dùng từ khoá else. Mỗi thứ trong khối mã lệnh thực thi điều kiện này được xem như là một phân nhánh và mỗi nhánh phải được định vị trong các dấu ngoặc nếu chức nhiều hơn một dòng lệnh.Ví dụ:
if ($h < h ="="" country ="="" position ="="" country ="="" position ="="" position ="="" country ="="" position ="="" country ="="" position ="="" country ="="" country ="="">2)Câu lệnh switch:
Được sử dụng khi một biến riêng rẽ đang được kiểm tra so với các giá trị khác.
Ví dụ:
switch ($country) {

case "ca":

echo ("Canada");

break;

case "uk":

echo ("the United Kingdom");

break;

default:

echo ("the United States");

}
Khi câu lệnh switch thực hiện kiểm tra giá trị của biến $country và so sánh nó với mỗi một trong các giá trị trong các mệnh đề case. Khi một giá trị thích hợp được tìm thấy, các câu lệnh kết hợp với case được thực hiện cho đến khi gặp câu lệnh break. Còn nếu không tìm ra được giá trị thích hợp nào thì câu lệnh default sẽ được thực hiện. Chú ý rằng lệnh switch trong PHP thì linh hoạt hơn nhiều so với hầu hết các ngôn ngữ khác. Không giống như C, Java và ngay cả JavaScript, các giá trị case cũng có thể là một trong các loại vô hướng, bao gồm tất cả các số ,các chuỗi và ngay cả các biến.Ví dụ:
$val = 6;$a = 5;$b = 6;

switch ($val) {

case $a:

echo ("five");

break;

case $b:

echo ("six");
break;

default:

echo ("$val");

}
Các mảng và các đối tượng chỉ là những loại dữ liệu là không phải là những nhãn đúng của case trong PHP.
3). Vòng lặp:
Các vòng lặp chính là các phương tiện của việc thực thi một khối mã lệnh trong một số lần cho trước hay là cho đến khi gặp phải một điều kiện nhất định. PHP có hai loại vòng lặp: vòng lặp while kiểm tra điều kiện trước hay là sau mỗi bước tính lặp đi lặp lại và thực hiện lặp lại chỉ khi điều kiện là đúng. Một kiểu lặp khác là for, trong trường hợp này, số lượng bước tính lặp đi lặp lại được qui định trước khi lặp lần đầu và không thể bị thay đổi.

a.Vòng lặp while:Là câu lệnh lặp đơn giản nhất. Cú pháp tương tự như câu lệnh if:
while (condition) {

//các câu lệnh

}
Một vòng lặp while sẽ kiểm tra một biểu thức Boolean. Nếu biểu thức là false thì đoạn mã bên trong dấu ngoặc móc sẽ được bỏ qua. Ngược lại, nếu có giá trị true thì đoạn mã bên trong dấu ngoặc móc sẽ được thực hiện. Khi gặp dấu } thí điều kiện kiểm tra sẽ được thực hiện lại và nếu có giá trị là true thì đoạn mã trong vòng lặp sẽ được thực hiện lại. Điều này sẽ tiếp tục cho đến khi gặp phải điều kiện . Chú ý rằng điều kiện chỉ được kiểm tra mỗi khi bắt đầu vòng lặp, bởi vậy ngay khi sự chính xác của điều kiện thay đổi trong suốt đoạn giữa của khối lệnh ,thì mã lệnh sẽ vẫn được thực thi cho đến hết. Để thoát khỏi vào thời điểm sớm hơn,ta có thể sử dụng lệnh break. Ví dụ:
$i = 11;

while (--$i) {

if (my_function($i) == "error") {

break; // dừng vòng lặp!

}

++$num_bikes;

}
Trong ví dụ này, nếu ta hình dung rằng hàm my_function không trả về bất kì lỗi nào thì vòng lặp sẽ lặp đi lặp lại 10 lần và dừng lại khi biến $i =0. Còn nếu my_function trả về lỗi, thì câu lệnh break sẽ được thực hiện và vòng lặp sẽ dừng lại. Có nhiều trường hợp mà chúng ta mong muốn kết thúc chỉ khi sự lặp lại hiện thời của vòng lặp không phải là toàn bộ vòng lặp của chính nó. Để đạt được điều này, ta sử dụng lệnh continue.Ví dụ:
$i = 11;

while (--$i) {

if (my_function($i) == "error") {

continue;

}

++$num_bikes;

}
Đoạn mã này cũng lặp đi lặp lại 10 lần nếu không có lỗi nào được trả về bởi hàm my_function. Tuy nhiên tại lúc này, nếu có lỗi xảy ra, việc thực hiện sẽ lướt qua sự lặp lại kế tiếp của vòng lặp, mà không tăng biến đếm $num_bikes.Giả sử biến $i vẫn lớn hơn 0, vòng lặp sẽ tiếp tục như bình thường.

b.Vòng lặp do…while:
Vòng lặp này cũng giống như while, ngoại trừ điều kiện được kiểm tra tại cuối mỗi vòng lặp, thay vì là ở đầu. Điều này có nghĩa là vòng lặp sẽ luôn luôn thực hiện ít nhất một lần. Ví dụ:
echo ("\n");
Với đoạn mã trên, giá trị zero luôn luôn xuất hiện như là một tùy chọn trong thành phần <>, ngay cả nếu biến $total_parts=0.
Các câu lệnh while và do…while thường được dùng với các toán tử tăng hay giảm để điều khiển khi nào thì bắt đầu và dừng như ví dụ trên. Các biến thường được dùng cho mục đích này đôi khi được định nghĩa như là các biến điều khiển vòng lặp.Thông thường sử dụng các câu lệnh while trong việc đọc các records từ một truy vấn cơ sở dữ liệu, từ các dòng trong một file hay là từ các nhân tố trong một mảng.
c.Vòng lặp for:
Cấu trúc của vòng lặp for là khá phức tạp hơn mặc dầu các vòng lặp for thường tiện lợi hơn các vòng lặp while:
for ($i = 1; $i < 11; ++$i) { echo ("$i
\n"); //In từ 1 đến 10

}
Câu lệnh for chứa ba biểu thức bên trong dấu ngoặc đơn của nó, phân biệt với nhau bởi dấu chấm phẩy.Biểu thức thứ nhất là một câu lệnh gán để khởi tạo biến điều khiển vòng lặp. Câu lệnh này được thực thi chỉ một lần trước sự lặp lại lần đầu của vòng lặp.Biểu thức thứ hai là biểu thức Boolean mà được thực thi tại đầu mỗi lần lặp. Nếu giá trị trả về là true thì vòng lặp sẽ tiếp tục thực hiện. Nếu là false thì vòng lặp kết thúc. Biểu thức thứ ba là một câu lệnh mà thực thi tại giai đoạn cuối của mỗi lần lặp của vòng lặp. Nó thường được dùng để tăng hay giảm các biến điều khiển vòng lặp .
Hằng số (Constant):
Hằng là một giá trị không thể chỉnh sửa được thông qua việc thực hiện chương trình. Bạn có thể định nghĩa một hằng bằng cách dùng hàm define( ). Một khi hằng được định nghĩa, nó không bao giờ bị thay đổi.
Chỉ có các kiểu dữ liệu boolean, integer, float, string mới có thể chứa các hằng. Bạn có thể nhận giá trị của một hằng bằng cách đơn giản chỉ định tên của nó. Không giống như với biến, bạn không cần khai báo $ trước một hằng. Bạn cũng có thể dùng hàm constant(), để đọc giá trị của hằng. Sử dụng hàm get_defined_constants( ) để nhận một danh sách tất cả các hàm đã được định nghĩa.
Các hằng được định nghĩa trước: PHP cung cấp một lượng lớn các hằng đã được định nghĩa trước để bất kỳ script nào cũng có thể chạy được.
Toán tử:
Toán tử là một ký hiệu chỉ định một hoạt động trong biểu thức.Các toán tử có trong PHP như sau:
( )
Thực hiện theo yêu cầu có thứ tự.
New :Minh hoạ một object mới.
! ~ Phép Not trong Boolean, Not trong Bitwise.
++ — Tự động tăng, tự động giảm
@ Che dấu lỗi.
/ * % Chia, nhân, chia lấy dư.
+ - . Cộng, trừ, nối.
<< >> Dịch sang trái, dịch sang phải trong Bitwise.
< <= > >= So sánh nhỏ hơn, nhỏ hơn hay bằng, lớn hơn, lớn hơn hay bằng.
== != === <> So sánh bằng, không bằng, giống nhau, khác nhau.
& ^ Phép AND, OR, XOR trong Bitwise.
&& Phép AND, OR trong Boolean.
?: Toán tử tam phân.
= += *= /= .= Các toán tử gán.
%=&= = ^= Các toán tử gán.
AND XOR OR Phép AND, XOR, OR trong Boolean.

Biến trong PHP

Biến trong PHP được thể hiện bởi dấu dollar $ và theo sau là tên của biến. Tên biến không phân biệt chữ hoa hay chữ thường. Tên biến phải bắt đầu bằng một chữ cái hay một dấu gạch nối_, theo sau là các chữ cái, chữ số hay là dấu gạch nối. Ví dụ:

var = "Bob";

$Var = "Joe";

echo "$var, $Var";

Trong PHP3 thì các biến phải luôn luôn được gán giá trị. Còn trong PHP4 thì cung cấp thêm một cách khác để gán giá trị cho biến: gán theo tham chiếu. Điều này có nghĩa là một biến mới có thể tham chiếu đến một biến nguyên thuỷ. Sự thay đổi của biến mới sẽ tác động đến biến nguyên thuỷ và ngược lại. Nó cũng có nghĩa là không có sao chép, do đó việc kết gán sẽ diễn ra nhanh hơn. Để thực hiện gán bằng tham chiếu, chỉ cần thêm & ở đầu tên của biến được gán.Ví dụ sau sẽ in ra dòng ‘My name is Bob’ hai lần:


Phạm vi của biến: Các biến trong PHP có thể là một trong bốn loại phạm vi sau:


- Biến cục bộ.
- Tham số các hàm.
- Biến toàn cục.
- Biến static.


1) Biến cục bộ:
Một biến được khai báo trong một hàm thì được xem như là một biến cục bộ và nó chỉ được tham chiếu trong hàm đó. Bất kể việc gán giá trị bên ngoài hàm đều xem như là biến hoàn toàn khác với biến trong hàm đó. Chú ý khi thoát khỏi hàm mà biến cục bộ được khai báo, thì biến và giá trị của nó sẽ bị huỷ bỏ. Biến cục bộ có thuận lợi bởi nó loại bỏ những khả năng của các tác động không dự đoán được làm thay đổi kết quả từ các biến có thể truy cập toàn cục.Ví dụ:

$x = 4;

function assignx () {

$x = 0;

print "\$x inside function is $x.
";

}

assignx();

print "\$x outside of function is $x.
";
Sau khi thực hiện sẽ có các kết quả như sau:
$x inside function is 0.

$x outside of function is 4.
2) Tham số của hàm:
cũng giống như nhiều ngôn ngữ lập trình khác, trong PHP hàm có chứa tham số phải khai báo các tham số trong phần đầu của hàm. Mặc dầu, những tham số này nhận các giá trị đến từ bên ngoài hàm, nhưng chúng sẽ chỉ có thể truy cập một khi hàm tồn tại. Các tham số của hàm được khai báo sau tên hàm và bên trong dấu {. Ví dụ:
function x10 ($value) {

$value = $value * 10;

return $value;}
Điều quan trọng cần phải chú ý là mặc dầu bạn có thể truy cập và thao tác với các tham số trong hàm mà nó được khai báo, nhưng nó sẽ bị huỷ bỏ khi hàm kết thúc thực hiện.
3) Biến toàn cục:
ngược lại với biến cục bộ, biến toàn cục có thể được truy cập từ bất cứ phần nào trong chương trình .Tuy nhiên, để có thể chỉnh sửa, biến toàn cục phải được khai báo toàn cục trong hàm mà nó được chỉnh sửa. Để khai báo một biến là toàn cục ta đặt từ khoá GLOBAL ở phía trước.Ví dụ:
$somevar = 15;

function addit() {

GLOBAL $somevar;

$somevar++;

print "Somevar is $somevar";

}

addit();
Kết quả của $somevar là 16. Tuy nhiên, nếu bạn bỏ dòng lệnh GLOBAL $somevar; thì biến $somevar sẽ chỉ có giá trị là 1, bởi biến $somevar được xem như là biến cục bộ trong hàm addit( ).
Một cách khác để khai báo một biến là toàn cục là sử dụng mảng $GLOBALS của PHP. Ví du, khai báo biến $somevar là toàn cục bằng cách sử dụng mảng này:

$somevar = 15;

function addit() {

$GLOBALS["somevar"];

$somevar++;

}

addit();

print "Somevar is $somevar";
4) Biến static:
tương phản với các biến được khai báo trong các tham số của hàm sẽ bị huỷ bỏ khi thoát khỏi hàm, biến static sẽ không mất giá trị của nó khi thoát khỏi hàm và sẽ giữ nguyên giá trị đó khi hàm được gọi lại lần nữa. Bạn có thể khai báo một biến là static bằng cách dùng từ khoá STATIC đặt trước tên biến.
Ví dụ:
function keep_track() {

STATIC $count = 0;

$count++;

print $count;

print "
";

}

keep_track();

keep_track();

keep_track();
Kết quả là :
1

2

3.Truy cập biến từ trình duyệt:
Khi dùng PHP, cũng như các phần mềm trung gian khác, thông tin được cung cấp tuỳ chọn dựa vào tham chiếu người dùng. Dĩ nhiên thông tin sẽ đến thông qua “form”. Thông tin cũng có thể đến từ những nơi khác, như “cookie” hay “sessions”.
a.Biến form:
Một trong những cách phổ biến là chuyển biến thông qua “form”. Mỗi thành phần trong form của chúng ta sẽ được gán tên và thuộc tính giá trị. Khi form được “submit” thì name=value sẽ được chuyển đến PHP. Chúng ta có thể chuyển đến PHP bởi phương pháp GET hoặc POST, tùy thuộc chúng ta chọn gì trong thuộc tính hành động của “form”. Một khi form được “submit”, những thành phần của form sẽ tự động trở thành những biến toàn cục trong PHP.

b.Sessions:
PHP cũng giống như ASP và ColdFusion đều hỗ trợ sessions. Vậy sessions là gì? Về cơ bản nó là một cách khác để duy trì trạng thái giữa các trang Web. Chúng ta bắt đầu một sessions bởi hàm start_session(). Khi đó PHP sẽ đăng ký một session ID duy nhất và gửi session ID đó về cho người dùng thông qua cookie. PHP sẽ tạo những tệp đáp trả trên server để có thể lưu giữ dấu vết của bất kỳ biến nào. Những tệp này có cùng tên với session ID.
Một khi session được tạo chúng ta có thể đăng ký bất kỳ biến số nào. Giá trị của nó sẽ được giữ trên một tệp ở máy chủ. Và như vậy trong thời gian sống của session những biến này sẽ được thực hiện bởi bất cứ trang nào trong cùng một tên miền mà không cần truy cập đến chúng.
Tuy nhiên có một số người dùng không cho phép cookie, khi đó PHP giữ dấu vết các session ID qua các querystring. Chúng ta có thể làm điều này bằng tay bằng cách cho sessiong ID phụ thuộc queryString, hoặc thay đổi tuỳ chọn cấu hình. Để thêm session Id đến querystring, ta dùng . Nó sẽ tự động in ra một chuỗi như sau:
PHPSESSID=07e935k3kkjr0986s9d89fr9trg8rgrg20

< a href=” mypage . php ? ”>Click my Page< / a >



Các kiểu dữ liệu trong PHP

PHP hỗ trợ tám kiểu dữ liệu nguyên thuỷ. Bốn kiểu thông thường là: boolean, integer, floating-point number(float), string. Hai kiểu phức tạp là: mảng( array) và đối tượng ( object). Và cuối cùng là hai kiểu đặc biệt : resource và NULL. Loại dữ liệu của biến thông thường không được gán bởi người lập trình mà được quyết định tại thời gian chạy của PHP, phụ thuộc vào ngữ cảnh mà biến được dùng.

Dữ liệu kiểu Boolean
Đây là kiểu đơn giản nhất. Một kiểu boolean biểu thị một giá trị thật. Nó có thể là TRUE hay FALSE.
Cú pháp: để chỉ định một giá trị boolean, có thể sử dụng từ khoá TRUE hay là FALSE. Cả hai đều không phân biệt chữ hoa hay chữ thường.
Ví dụ:

$foo=True; // gán giá trị TRUE cho biến $foo.

Để có thể chuyển một giá trị sang kiểu boolean, chúng ta có thể dùng (bool) hay (boolean). Tuy nhiên trong hầu hết các trường hợp bạn không cần phải sử dụng việc ép kiểu này, bởi giá trị sẽ được tự động chuyển nếu nó là một toán tử, hàm hay là cấu trúc điều khiển đòi hỏi một tham số kiểu boolean.

Chú ý: -1 được xem là TRUE, giống như các giá trị khác 0 khác ( bất kể là số
dương hay âm).

Dữ liệu kiểu số nguyên Integer

Là một tập hợp bao gồm các số {…,-2,-1,0,1,2,…}.Cú pháp: Integer có thể được chỉ định trong cơ số 10, cơ số thập lục phân hay cơ số bát phân, tuỳ chọn đi trước bởi dấu - hay +. Nếu bạn sử dụng với cơ số bát phân, bạn phải theo thứ tự với 0 đứng trước, còn đối với số thập lục phân thì 0x.Ví dụ như sau:

$a = 1234; # số thập phân

$a = -123; # số âm

$a =
0123; # số bát phân

$a = 0x1A; # số thập lục phân
Kích thước của kiểu dữ liệu này là 32bit, và PHP không hỗ trợ kiểu unsigned integer. Nếu bạn chỉ định một số vượt qua biên của kiểu dữ liệu integer, nó sẽ được xem như kiểu float . Tương tự như vậy, khi bạn thực hiện một phép toán mà kết quả trả về là một số vượt qua biên của kiểu integer, thì kiểu float sẽ được trả về. Tuy nhiên, có một lỗi trong PHP mà không phải bao giờ điều này cũng đúng, nó liên quan đến các số âm. Chẳng hạn, khi bạn thực hiện -50000* $million, kết quả sẽ là 429496728. Tuy nhiên, khi cả hai toán tử đều là số dương thì không có vấn đề gì xảy ra.
Để chuyển một giá trị sang kiểu integer, ta có thể dùng toán tử ép kiểu (int) hay (integer). Tuy nhiên, trong hầu hết các trường hợp bạn không cần phải dùng toán tử ép kiểu đó, bởi giá trị sẽ được tự động chuyển sang nếu toán tử, hàm hay cấu trúc điều khiển đòi hỏi một đối số integer.

Dữ liệu kiểu số thực (floats,doubles,hay real numbers)
Có thể được chỉ định bằng cách sử dụng một trong các cú pháp sau:

$a = 1.234; $a = 1.2e3; $a = 7E-10;


Kích cỡ của kiểu float tùy thuộc vào platform, giá trị lớn nhất là xấp xỉ 1.8e308

Dữ liệu kiểu chuỗi ( string)

String :là những chuỗi các kí tự.Trong PHP,một kí tự cũng tương tự như một byte,do đó có chính xác 256 kí tự khác nhau.Cú pháp: có thể khai báo bằng ba cách khác nhau như sau:

  • Dấu nháy đơn: cách dễ dàng nhất để chỉ định một chuỗi đơn giản là đóng nó trong một dấu nháy đơn.Ví dụ:echo ‘le bao vy’;

  • Dấu nháy kép: nếu chuỗi được đóng trong dấu nháy kép(”),PHP hiểu sẽ có thêm các chuỗi cho các kí tự đặc biệt ….. Ví dụ: \n;\t;\\;\$;…

  • Heredoc: các khác để phân định chuỗi là sử dụng cú pháp (”<<<"). Chỉ nên cung cấp một định danh sau <<<, sau đó là chuỗi và tiếp là cùng tên định danh để đóng dấu nháy. Định danh dùng để đóng phải bắt đầu bằng cột đầu tiên của dòng. Định danh được dùng phải có tên giống như trong các quy luật đặt tên biến trong PHP.

Dữ liệu kiểu mảng ( array)

Là một danh sách các phần tử có cùng kiểu dữ liệu.Mảng có thể là mảng một chiều hay nhiều chiều.

Mảng một chiều có chỉ mục: là mảng được quản lý bằng cách sử dụng chỉ số dưới kiểu integer để biểu thị vị trí của giá trị yêu cầu.Cú pháp: $name[index1];
Ví dụ: một mảng một chiều có thể được tạo ra như sau:

$meat[0]="chicken";

$meat[1]="steak";

$meat[2]="turkey";


Nếu bạn thực thi dòng lệnh sau: print $meat[1]; thì trên trình duyệt sẽ hiển thị dòng sau: steak.
Bạn cũng có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ:

$meat=array("chicken","steak","turkey");


Mảng một chiều kết hợp: rất thuận lợi khi dùng để ánh xạ một mảng sử dụng các từ hơn là sử dụng các integer, nó giúp ta giảm bớt thời gian và các mã yêu cầu để hiển thị một giá trị cụ thể. Ví dụ: bạn muốn ghi lại tất cả các thức ăn và các cặp rượu ngon.

$pairings["zinfandel"] = "Broiled Veal Chops";

$pairings["merlot"]
= "Baked Ham";

$pairings["sauvignon"] = "Prime Rib";


Một cách khác là bạn có thể sử dụng hàm array( ) của PHP để tạo ra một mảng loại này, ví dụ như sau:

$pairings = array( zinfandel => "Broiled Veal Chops",

merlot
=> "Baked Ham",sauvignon => "Prime Rib",

sauternes =>
"Roasted Salmon";

Mảng nhiều chiều có chỉ mục: chức năng của nó cũng giống như mảng một chiều có chỉ mục, ngoại trừ việc nó có thêm một mảng chỉ mục được dùng để chỉ định một phần tử. Cú pháp: $name[index1] [index2]..[indexN];
Một mảng hai chiều có chỉ mục được tạo ra như sau:

$position = $chess_board[5][4];


Mảng đa chiều kết hợp: khá hữu ích trong PHP. Giả sử bạn muốn ghi lại các cặp rượu-thức ăn, không chỉ loại rượu, mà cả nhà sản xuất. Bạn có thể thực hiện như sau:

$pairings["Martinelli"] ["zinfandel"] = "Broiled Veal
Chops";

$pairings["Beringer"] ["merlot"] = "Baked
Ham";

$pairings["Jarvis"] ["sauvignon"] = "Prime Rib";

Dữ liệu kiểu đối tượng( Object )

Bạn có thể xem object như là một biến mà minh hoạ một kiểu mẫu template được gọi là class. Khái niệm của đối tượng và lớp được sử dụng nhiều trong ngôn ngữ lập trình hướng đối tượng OOP. Không giống như các kiểu dữ liệu khác trong PHP, object phải được khai báo.Điều quan trọng là phải nhận ra rằng object không hơn gì một minh hoạ của một lớp, và hoạt động như là một khuôn mẫu cho việc tạo các object có các đặc tính và chức năng cụ thể. Cho nên, lớp(class) phải được định nghĩa trước khi khai báo một object. Để khởi tạo một đối tượng, bạn sử dung câu lệnh new để minh hoạ đối tượng với một biến.Ví dụ:

do_foo();

?>

Dữ liệu kiểu Resource

Là một biến đặc biệt, chứa một tham chiếu đến một resource bên ngoài. Các resource được tạo ra và sử dụng bởi các hàm đặc biệt.
Giải phóng resources: bởi do tham chiếu đếm của hệ thống được giới thiệu trong PHP4 Zend-engine, nó sẽ tự động phát hiện khi một resource không cần thiết cho lâu dài. Khi ở trong trường hợp này, tất cả các resource mà đã được dùng cho resource này được giải phóng bởi “bộ phận thu nhặt rác”. Do đó, hiếm khi thật sự cần thiết để giải phóng bộ nhớ thông thường bằng cách sử dụng hàm free_result().

Dữ liệu kiểu NULL

Giá trị NULL đặc biệt dùng để thể hiện một biến không có giá trị. Một biến được xem là NULL nếu:
Nó được gán giá trị hằng số NULL.
Nó chưa được khởi tạo giá trị nào.
Nó là hàm unset( )
Chú thích: unset () là một hàm dùng để hủy bỏ các biến chỉ định.
Cú pháp: chỉ có một loại giá trị của kiểu NULL. Bạn có thể khai báo như ví dụ sau:
$var=NULL;

Khởi đầu với PHP

Các cách làm việc với PHP:

Cách đơn giản nhất để khởi đầu với PHP là thử qua 1 ví dụ đơn giản nhất , tạo ứng dụng xuất ra trình duyệt dòng chữ quen thuộc với dân lập trình ” Hello World” Có 4 cách để dùng PHP:
Cách thứ nhất : dùng short tag báo cho server biết rằng đây là mã PHP. Bắt đầu đoạn mã bằng . Để viết theo cách này server của bạn phải được bật cho phép sử dụng short_open_tag trong php.ini . Thông thường các server đều mặc định bật .


Cách thứ hai : Đây là phương pháp chuẩn để đánh dấu bắt đầu và kết thúc 1 đoạn code PHP ( khuyên dùng) , mở đầu bằng

echo "Hello World";
?>

Hoặc các bạn có thể sữ dụng 2 cách sau . Chỉ để tham khảo, không khuyến khích dùng.


<% echo "Hello World"; %>

Cách thứ tư chỉ có tác dụng nếu asp_tag được đặt trong file cấu hình của PHP.
Tất cả các cách trên chỉ khác nhau về phần khai báo khởi đầu và kết thúc 1 đoạn code PHP , phần nội dung chương trình hoàn tòan giống nhau với câu lệnh .
echo "Hello World";
echo là 1 hàm dựng sẵn của PHP ( có thể gọi là lệnh cũng được) dùng để xuất 1 giá trị ra trình duyệt. Ở đây xuất dòng chữ “Hello World” ra màn hình. Cặp dấu ” dùng để báo cho PHP biết đó là chuỗi. Và bạn cũng thấy ở đây PHP qui định kết thúc mỗi câu lệnh sẽ được đánh dấu bằng dấu chấm phẩy ; . Lưu ý đều này , nếu thiếu cái này bạn sẽ được báo 1 lỗi cú pháp.Ví dụ đoạn sau đây sẽ báo lỗi :

echo "Hello World"
?>


Làm thế nào để tạo 1 file PHP

PHP không cần chương trình gì riêng biệt để tạo các file PHP, bạn chỉ cần dùng các chương trình soạn thảo văn bản bình thường để tạo.
Chú thích trong PHP

Các bạn có thể chú thích ( comments) trong PHP có thể bằng các cách sau:
// Nội dung chú thích

# Nội dung chú
thích

/*

Nội dung chú thích

*/

Với chú thích bằng cách dùng // và # thì bắt đầu mỗi dòng chú thích bạn đều phải dùng các ký hiệu này để đánh dấu.
Với việc dùng /* và */ bạn có thể dùng cho 1 đoạn văn bản với khởi đầu bằng /* và kết thúc bằng */

Giới Thiệu PHP

PHP là gì?
PHP là một ngôn ngữ lập trình kiểu script, chạy trên Server và trả về mã HTML cho trình duyệt. PHP gần như đã trở thành một ngôn ngữ lập trình Web rất phổ biến trên mạng hiện nay. PHP là chữ viết tắt của cụm từ “PHP Hypertext Preprocessor”, tạm dịch là ngôn ngữ tiền xử lí các siêu văn bản. Các mã lệnh PHP được nhúng vào các trang web, các trang này thường có phần mở rộng là .php, .php3, .php4. Khi client gởi yêu cầu “cần tải các trang này về” đến web server, đầu tiên web server sẽ phân tích và thi hành các mã lệnh PHP được nhúng trong, sau đó trả về một trang web kết quả đã được xử lí cho client.
Bạn có thể hỏi, tại sau có nhiều tuỳ chọn như ASP, Cold Fusion, Perl, Java, Python nhưng chúng ta lại chọn PHP? Và câu trả lời là: bởi nó là một ngôn ngữ rất dễ dùng, dễ học, cú pháp lệnh đơn giản, các biến không cần phải khai báo trước khi dùng, tự động ép kiểu(typecast), chạy nhanh, tập hàm built-in rất phong phú, có mã nguồn mở…


Lịch sử hình thành và phát triển PHP

PHP/FI
PHP được phát triển từ một sản phẩm có tên là PHP/FI. PHP/FI do Rasmus Lerdorf tạo ra năm 1995, ban đầu được xem như là một tập con đơn giản của các mã kịch bản Perl để theo dõi tình hình truy cập đến bản sơ yếu lý lịch của ông trên mạng. Ông đã đặt tên cho bộ mã kịch bản này là ‘Personal Home Page Tools’. Khi cần đến các chức năng rộng hơn, Rasmus đã viết ra một bộ thực thi bằng C lớn hơn để có thể truy vấn tới các cơ sở dữ liệu và giúp cho người sử dụng phát triển các ứng dụng web đơn giản. Rasmus đã quyết định công bố mã nguồn của PHP/FI cho mọi người xem, sử dụng cũng như sửa các lỗi có trong nó đồng thời cải tiến mã nguồn.
PHP/FI, viết tắt từ “Personal Home Page/Forms Interpreter”, bao gồm một số các chức năng cơ bản cho PHP như ta đã biết đến chúng ngày nay. Nó có các biến kiểu như Perl, thông dịch tự động các biến của form và cú pháp HTML nhúng. Cú pháp này giống như của Perl, mặc dù hạn chế hơn nhiều, đơn giản và có phần thiếu nhất quán.
Vào năm 1997, PHP/FI 2.0, lần viết lại thứ hai của phiên bản C, đã thu hút được hàng ngàn người sử dụng trên toàn thế giới với xấp xỉ 50.000 tên miền đã được ghi nhận là có cài đặt nó, chiếm khoảng 1% số tên miền có trên mạng Internet. Tuy đã có tới hàng nghìn người tham gia đóng góp vào việc tu chỉnh mã nguồn của dự án này thì vào thời đó nó vẫn chủ yếu chỉ là dự án của một người.
PHP/FI 2.0 được chính thức công bố vào tháng 11 năm 1997, sau một thời gian khá dài chỉ được công bố dưới dạng các bản beta. Nhưng không lâu sau đó, nó đã được thay thế bởi các bản alpha đầu tiên của PHP 3.0.

PHP 3

PHP 3.0 là phiên bản đầu tiên cho chúng ta thấy một hình ảnh gần gũi với các phiên bản PHP mà chúng ta được biết ngày nay. Nó đã được Andi Gutmans và Zeev Suraski tạo ra năm 1997 sau khi viết lại hoàn toàn bộ mã nguồn trước đó. Lý do chính mà họ đã tạo ra phiên bản này là do nhận họ thấy PHP/FI 2.0 hết sức yếu kém trong việc phát triển các ứng dụng thương mại điện tử mà họ đang xúc tiến trong một dự án của trường đại học. Trong một nỗ lực hợp tác và bắt đầu xây dựng dựa trên cơ sở người dùng đã có của PHP/FI, Andi, Rasmus và Zeev đã quyết định hợp tác và công bố PHP 3.0 như là phiên bản thế hệ kế tiếp của PHP/FI 2.0, và chấm dứt phát triển PHP/FI 2.0.
Một trong những sức mạnh lớn nhất của PHP 3.0 là các tính năng mở rộng mạnh mẽ của nó. Ngoài khả năng cung cấp cho người dùng cuối một cơ sở hạ tầng chặt chẽ dùng cho nhiều cơ sở dữ liệu, giao thức và API khác nhau, các tính năng mở rộng của PHP 3.0 đã thu hút rất nhiều nhà phát triển tham gia và đề xuất các mô đun mở rộng mới. Hoàn toàn có thể kết luận được rằng đây chính là điểm mấu chốt dẫn đến thành công vang dội của PHP 3.0. Các tính năng khác được giới thiệu trong PHP 3.0 gồm có hỗ trợ cú pháp hướng đối tượng và nhiều cú pháp ngôn ngữ nhất quán khác.
Ngôn ngữ hoàn toàn mới đã được công bố dưới một cái tên mới, xóa bỏ mối liên hệ với việc sử dụng vào mục đích cá nhân hạn hẹp mà cái tên PHP/FI 2.0 gợi nhắc. Nó đã được đặt tên ngắn gọn là ‘PHP’, một kiểu viết tắt hồi quy của “PHP: Hypertext Preprocessor”.
Vào cuối năm 1998, PHP đã phát triển được con số cài đặt lên tới hàng chục ngàn người sử dụng và hàng chục ngàn Web site báo cáo là đã cài nó. Vào thời kì đỉnh cao, PHP 3.0 đã được cài đặt cho xấp xỉ 10% số máy chủ Web có trên mạng Internet.
PHP 3.0 đã chính thức được công bố vào tháng 6 năm 1998, sau thời gian 9 tháng được cộng đồng kiểm nghiệm.

PHP 4

Vào mùa đông năm 1998, ngay sau khi PHP 3.0 chính thức được công bố, Andi Gutmans và Zeev Suraski đã bắt đầu bắt tay vào việc viết lại phần lõi của PHP. Mục đích thiết kế là nhằm cải tiến tốc độ xử lý các ứng dụng phức tạp, và cải tiến tính mô đun của cơ sở mã PHP. Những ứng dụng như vậy đã chạy được trên PHP 3.0 dựa trên các tính năng mới và sự hỗ trợ khá nhiều các cơ sở dữ liệu và API của bên thứ ba, nhưng PHP 3.0 đã không được thiết kế để xử lý các ứng dụng phức tạp như thế này một cách có hiệu quả.
Một động cơ mới, có tên ‘Zend Engine’ (ghép từ các chữ đầu trong tên của Zeev và Andi), đã đáp ứng được các nhu cầu thiết kế này một cách thành công, và lần đầu tiên được giới thiệu vào giữa năm 1999. PHP 4.0, dựa trên động cơ này, và đi kèm với hàng loạt các tính năng mới bổ sung, đã chính thức được công bố vào tháng 5 năm 2000, gần 2 năm sau khi bản PHP 3.0 ra đời. Ngoài tốc độ xử lý được cải thiện rất nhiều, PHP 4.0 đem đến các tính năng chủ yếu khác gồm có sự hỗ trợ nhiều máy chủ Web hơn, hỗ trợ phiên làm việc HTTP, tạo bộ đệm thông tin đầu ra, nhiều cách xử lý thông tin người sử dụng nhập vào bảo mật hơn và cung cấp một vài các cấu trúc ngôn ngữ mới.
Với PHP 4, số nhà phát triển dùng PHP đã lên đến hàng trăm nghìn và hàng triệu site đã công bố cài đặt PHP, chiếm khoảng 20% số tên miền trên mạng Internet.
Nhóm phát triển PHP cũng đã lên tới con số hàng nghìn người và nhiều nghìn người khác tham gia vào các dự án có liên quan đến PHP như PEAR, PECL và tài liệu kĩ thuật cho PHP.

PHP 5

Sự thành công hết sức to lớn của PHP 4.0 đã không làm cho nhóm phát triển PHP tự mãn.Cộng đồng php đã nhanh chóng giúp họ nhận ra những yếu kém của PHP 4 đặc biệt với khả năng hỗ trợ lập trình hướng đối tượng (OOP), xử lý XML, không hỗ trợ giao thức máy khách mới của MySQL 4.1 và 5.0, hỗ trợ dịch vụ web yếu. Những điểm này chính là mục đích để Zeev và Andi viết Zend Engine 2.0, lõi của PHP 5.0. Một thảo luận trên Slashdot đã cho thấy việc phát triển PHP 5.0 có thể đã bắt đầu vào thời điểm tháng 12 năm 200229 tháng 6 năm 2003, PHP 5 Beta 1 đã chính thức được công bố để cộng đồng kiểm nghiệm. Đó cũng là phiên bản đầu tiên của Zend Engine 2.0. Phiên bản Beta 2 sau đó đã ra mắt vào tháng 10 năm 2003 với sự xuất hiện của hai tính năng rất được chờ đợi: Iterators, Reflection nhưng namespaces một tính năng gây tranh cãi khác đã bị loại khỏi mã nguồn. Ngày 21 tháng 12 năm 2003: PHP 5 Beta 3 đã được công bố để kiểm tra với việc phân phối kèm với Tidy, bỏ hỗ trợ Windows 95, khả năng gọi các hàm PHP bên trong XSLT, sửa chữa nhiều lỗi và thêm khá nhiều hàm mới. PHP 5 bản chính thức đã ra mắt ngày 13 tháng 7 năm 2004 sau một chuỗi khá dài các bản kiểm tra thử bao gồm Beta 4, RC 1, RC2, RC3. Mặc dù coi đây là phiên bản sản xuất đầu tiên nhưng PHP 5.0 vẫn còn một số lỗi trong đó đáng kể là lỗi xác thực HTTP. nhưng những bài phỏng vấn Zeev liên quan đến phiên bản này thì đã có mặt trên mạng Internet vào khoảng tháng 7 năm 2002. Ngày
Ngày 14 tháng 7 năm 2005, PHP 5.1 Beta 3 được PHP Team công bố đánh dấu sự chín muồi mới của PHP với sự có mặt của PDO, một nỗ lực trong việc tạo ra một hệ thống API nhất quán trong việc truy cập cơ sở dữ liệu và thực hiện các câu truy vấn. Ngoài ra, trong PHP 5.1, các nhà phát triển PHP tiếp tục có những cải tiến trong nhân Zend Engine 2, nâng cấp mô đun PCRE lên bản PCRE 5.0 cùng những tính năng và cải tiến mới trong SOAP, streams và SPL

PHP 6

Hiện nay phiên bản tiếp theo của PHP đang được phát triển, PHP 6 bản sử dụng thử đã có thể được download tại địa chỉ Snaps. Phiên bản PHP 6 được kỳ vọng sẽ lấp đầy những khiếm khuyết của PHP ở phiên bản hiện tại, ví dụ: hỗ trợ namespace (hiện tại các nhà phát triển vẫn chưa công bố rõ ràng về vấn đề này); hỗ trợ Unicode; sử dụng PDO làm API chuẩn cho việc truy cập cơ sở dữ liệu, các API cũ sẽ bị đưa ra thành thư viện PECL…