Discuz教程网

PHP学习笔记

[复制链接]
authicon 09927306 发表于 2011-1-18 12:21:44 | 显示全部楼层 |阅读模式
本系列适合有其他编程语言经验而PHP经验为0的人快速参考入门。
配置PHP以及MySQL的过程略去,如果在Ubuntu下,参考 Ubuntu 10.04 Installation Memo 即可。

1. 基本语法

要在HTML代码中嵌入PHP脚本的方法是在
  1. <?php ?>中书写代码。向浏览器输出数据采用echo或者print函数。echo可以接受多个参数,print 只能接受一个。echo的形式是
  2. void echo(string arg1,[,…string argn]);
  3. PHP语法允许省略括号。 例如,
  4. 代码如下:
  5. [code]<?php
  6. $my =\' my \';
  7. echo \'Hello\',$my,\'world\'
  8. ?>
复制代码


将会在浏览器上输出 Hello my world
PHP 还支持一个和C语言很像的printf函数,例如 printf(‘ %d apples\',100),将会输出 100 apples。sprintf的用法和printf一致,不过它不是输出到浏览器,而是返回一个字符串。
2.数据类型和变量
PHP是弱类型的,一个变量不需要预先声明,也不需要指定类型。PHP中变量是$加上变量名,PHP的变量是区分大小写的。 例如上例中的 $my=\'my\'。
PHP支持的变量类型包括:布尔型,整型,浮点型,字符串,数组和对象。前四种很常用,也和其他语言类似,不多做介绍。数组和对象后文具体介绍。
PHP中有函数来检测 对象的类型,它们是 getttype。gettype返回一个string,它的值可以是array,boolean,double,integer,object,resource,string 和 unknow type. PHP也支持显式的类型转换,语法和C类似。
转换操作符 转换为
(array) 数组
(bool) (boolean) 布尔型
(int) (integer) 整数
(object) 对象
(float),(double),(real) 浮点数
(string) 字符串
例如:
代码如下:
  1. <?php
  2. $str =\'a string\';
  3. $num=15;
  4. $numstr=\'123.3\';
  5. echo gettype($str),\'<br/>\';
  6. echo gettype($num),\'<br/>\';
  7. echo gettype($numstr),\'<br/>\';
  8. $numstr=(float)$numstr;
  9. echo gettype($numstr);
  10. ?>
复制代码


输出结果为:

string
integer
string
double

还有函数可以用来判断一个变量是不是某种类型,例如 is_array(),is_bool()等等,用法都类似。

3. 函数和变量作用域
PHP声明函数的方法很简单,形式如下:
代码如下:
function functionName(parameters){
function body
}

不需要指定返回类型,括号中也不需要指定变量类型,只要有变量名就可以。例如:
代码如下:
  1. <?php
  2. function taxedPrice($price,$taxrate){
  3. return $price*(1+$taxrate);
  4. }
  5. echo taxedPrice(100, 0.03);
  6. ?>
复制代码


默认情况下,PHP是按值传递参数的,在函数内改变参数的值并不会改变函数外变量的值,但是PHP也支持按引用传递,语法和C一致,&$paramName,例如,下面一个经典的例子:
代码如下:
  1. <?php
  2. function swap1($x,$y){
  3. $t=$x;$x=$y;$y=$t;
  4. }
  5. function swap2(&$x,&$y){
  6. $t=$x;$x=$y;$y=$t;
  7. }
  8. $a=3;$b=5;
  9. swap1($a,$b);
  10. printf("a is %d, b is %d <br/>",$a,$b);
  11. swap2($a,$b);
  12. printf("a is %d, b is %d <br/>",$a,$b);
  13. ?>
复制代码


输出结果:

a is 3, b is 5
a is 5, b is 3

PHP的函数还支持参数的默认值,语法和C也是一样的。例如:
代码如下:
  1. <?php
  2. function taxedPrice($price,$taxrate=0.03){
  3. return $price*(1+$taxrate);
  4. }
  5. echo taxedPrice(100);
  6. ?>
复制代码


下面介绍变量的作用域。PHP的变量作用域和C很类似,有局部变量,函数参数,全局变量,静态变量4种。局部变量就是在函数内声明的变量,函数参数是在函数首部声明的变量;不在函数中声明的变量是全局变量,全局变量可以在任何地方访问到,但是和C不同的是,如果在函数中要修改全局变量的值需要用GLOBAL关键字显式指定它是全局变量,否则PHP就会声明一个同名的局部变量并且覆盖它。例如:
代码如下:
  1. <?php
  2. $taxrate=0.03; //global
  3. function change1() {
  4. $taxrate+=1;
  5. }
  6. function change2() {
  7. GLOBAL $taxrate;
  8. $taxrate+=1;
  9. }
  10. change1();
  11. echo $taxrate,\'<br/>\';
  12. change2();
  13. echo $taxrate,\'<br/>\';
  14. ?>
复制代码


输出的结果是:

0.03

1.03

PHP还有一种超级全局变量。超级全局变量是由PHP系统预定义的,主要用来访问与环境有关的信息,例如当前用户会话,用户操作环境和本地环境等。超级全局变量是一个数组,例如$_SERVER中存储了服务器相关的信息。$_GET,$_POST,$_FILES,$_COOKIE中分别存储了客户端采用get提交,和post的提交的信息,上传的文件,cookie信息等。这些变量的使用都很简单,需要什么信息只需要查找

4 变量的变量
和C一类的静态语言不同,PHP的变量名本身可以是一个变量,这对于需要动态生成很多变量的时候是很便利的。例如:
代码如下:
  1. <?php
  2. $r="hello";
  3. $$r="I am hello";
  4. echo $hello;
  5. ?>
复制代码


输出结果为: I am hello

5.流程控制语句
主要包括,if else, while,for,do while,switch. 这些和C语言都很像,基本是一致的。不多做介绍。有些不同,PHP的 elseif是一个关键字,是连在一起的,而C语言是else if





上一篇:php短域名转换为实际域名函数
下一篇:php下连接mssql2005的代码
authicon  楼主| 09927306 发表于 2011-1-18 12:23:35 | 显示全部楼层
1. 数组
PHP的数组其实是一个关联数组,或者说是哈希表。PHP不需要预先声明数组的大小,可以用直接赋值的方式来创建数组。例如:
//最传统,用数字做键,赋值
$state[0]="Beijing";
$state[1]="Hebei";
$state[2]="Tianjin";
//如果键是递增的数字,则可以省略
$city[]="Shanghai";
$city[]="Tianjin";
$city[]="Guangzhou";
//用字符串做键
$capital["China"]="Beijing";
$capital["Japan"]="Tokyo";
用array()来创建数组会更加方便一点,可以将数组元素作为array的参数传递给他,也可以用=>运算符创建关联数组。例如:
$p=array(1,3,5,7);
$capital=array(“China”=>”Beijing”, “Japan=>”Tokyo”);
array其实是一种语法结构,而不是函数。和array类似,还有一个list(),它可以用来提取数组中的值,并给多个变量赋值。例如:
list($s,$t)=$city;
echo $s,' ',$t;
输出结果:Shanghai Tianjin
注意,list方法只能用于由数字索引的数组。
PHP内建了一些常用的数组处理函数,具体可以参考手册。常用的函数举例如下,count或者sizeof可以得到数组的长度,array_merge 可以合并两个,或者多个数组,array_push(pop)可以像堆栈一样使用数组。
代码如下:
  1. <?php
  2. $state[0]="Beijing";
  3. $state[1]="Hebei";
  4. $state[2]="Tianjin";
  5. $city[]="Shanghai";
  6. $city[]="Tianjin";
  7. $city[]="Guangzhou";
  8. $capital["China"]="Beijing";
  9. $capital["Japan"]="Tokyo";
  10. echo count($city),'<br/>';
  11. array_push($capital,"Paris");
  12. $newarray=array_merge($city,$capital);
  13. foreach($newarray as $elem)
  14. echo $elem.'<br/>';
  15. ?>
复制代码

输出结果为:
3
Shanghai
Tianjin
Guangzhou
Beijing
Tokyo
Paris
2. 类和对象
PHP5开始对面向对象编程有了很好的支持。PHP中的类的概念和其他面向对象的语言比如C#是十分相似的,它也是一个值和方法的聚合体,使用class关键字定义。例如:
代码如下:
  1. <?php
  2. class AuthUser {
  3. protected $userName;
  4. protected $password;
  5. public function __construct($userName,$password) {
  6. $this->userName=$userName;
  7. $this->password=$password;
  8. }
  9. public function GetUserName() {
  10. return $userName;
  11. }
  12. public function ChangePassword($old,$new) {
  13. if($this->password==$old) {
  14. $this->password=$new;
  15. return true;
  16. }else
  17. return false;
  18. }
  19. public function Login($password) {
  20. return $this->password==$password;
  21. }
  22. public static function CreateUser($userName,$password) {
  23. $user=new AuthUser($userName,$password);
  24. return $user;
  25. }
  26. }
  27. $user=AuthUser::CreateUser("Admin","123");
  28. echo $user->GetUserName();
  29. if($user->ChangePassword('abc', 'new'))
  30. echo 'ChangePassword success';
  31. else
  32. echo 'Change Password fail';
  33. $user->ChangePassword("123", "321");
  34. if($user->Login("321"))
  35. echo "Login";
  36. else
  37. echo "Login fail";
  38. ?>
复制代码

上面是一个虽然没有什么用但是语法结构上较为完整的类。首先使用class关键字定义类的名字,内部可以定义字段和方法。字段和方法的修饰词可以是private,protected,public 和 final(仅方法有)。其含义和其它语言一致。不再赘述。不同的地方在于,PHP不支持函数的重载。另外,PHP5的构造函数的定义是__construct,注意前缀是两个下划线。PHP4的构造函数的定义和其它语言一致,是和类名一样的函数,PHP5也兼容这种写法。PHP5还支持析构函数,名字是__destruct。在函数内部,可以使用$this变量来获得当前对象的引用。 PHP也支持静态函数,同样是使用static关键字修饰。示例中最后一个函数就静态函数。静态函数不能通过类的实例引用。
类的定义下面是使用类的代码示例,PHP也是通过new关键字来实例化一个类。通过->运算符来引用对象的方法。注意其静态类的引用方法是::,这是和C++一致的。
下面再简单介绍下类的继承。PHP中使用extends关键字来实现类的继承,这是和Java一致的:
代码如下:
  1. <?php
  2. class BaseClass {
  3. function __construct() {
  4. print "In BaseClass constructor\n";
  5. }
  6. }
  7. class SubClass extends BaseClass {
  8. function __construct() {
  9. parent::__construct();
  10. print "In SubClass constructor\n";
  11. }
  12. }
  13. $obj = new BaseClass();
  14. $obj = new SubClass();
  15. ?>
复制代码

输出的结果是: In BaseClass constructor In BaseClass constructor In SubClass constructor
要注意,PHP的子类的构造函数不会自动调用父类的构造函数,必须在程序中显式地调用。使用parent关键字可以得到父类的引用。另外,由于PHP本身是弱类型的,所以“多态“的概念也不存在了,实际上,它永远都是多态的。
接口
接口定义了一组方法,但不实现他们。其语法为:
interface IInterfaceName
{
//常量、函数定义
}类利用implements关键字来表面实现某个接口,这和Java是一致的。
代码如下:
  1. <?php
  2. interface IAddable{
  3. function Add($something);
  4. }
  5. class AddClass implements IAddable
  6. {
  7. private $data;
  8. function AddClass($num){
  9. $data=$num;
  10. }
  11. public function Add($something)
  12. {
  13. $data+=$something;
  14. return $data;
  15. }
  16. }
  17. $a=new AddClass (5);
  18. echo $a instanceof IAddable;
  19. echo $a->Add(10);
  20. ?>
复制代码

其中 instanceof关键字是PHP5新增的,用来判断一个对象是不是某个类的实例,或者它的类型是不撒实现了某个接口。
authicon  楼主| 09927306 发表于 2011-1-18 12:27:08 | 显示全部楼层
下面是在Linux上登录mysql,创建数据库和创建表的过程。
yin@yin-Ubuntu10:~$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 360
Server version: 5.1.41-3ubuntu12.1 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database UseCase;
Query OK, 1 row affected (0.00 sec)
mysql> use UseCase;
Database changed
mysql> create table User(UserName varchar(20) primary key,Password varchar(20) not null,CreateTime timestamp default current_timestamp);
Query OK, 0 rows affected (0.01 sec)下面就来建立一个页面来完成新建用户的页面。首先是一个简单的表单:
代码如下:

  1. <form action="db.php" method="post">
  2. <dl>
  3. <dt>UserName</dt><dd><input name="UserName" maxlength="20" type="text"/></dd>
  4. <dt>Password</dt><dd><input name="Password" maxlength="20" type="password"/></dd>
  5. <dt>Confirm Password</dt><dd><input name="ConfirmPassword" maxlength="20" type="password"/></dd>
  6. </dl>
  7. <input type="submit" name="ok" value="ok"/>
  8. </form>
复制代码

PHP通过$_POST数组来获得通过post方法提交的表单中的数据。在PHP程序中,我们首先要判断是有OK字段,从而判断出该页面是首次访问,还是用户点击OK后提交的,接着判断两次密码输入是否统一。然后就可以获取到用户名和密码,插入数据库中。PHP连接MySQL数据库一般可以利用mysql扩展或者mysqli扩展,mysqli扩展比较新一点,这里我们采用这种方式。mysqli可能需要安装配置下,不过在我的环境中是默认装好的。利用mysqli扩展操作数据库一般分为如下几步:构造mysqli对象,构造statement,绑定参数,执行,关闭。代码如下:

  1. 代码如下:[code]
  2. <?php
  3. $match=true;
  4. if(isset($_POST["ok"])) {
  5. $pwd=$_POST["Password"];
  6. $pwdConfirm=$_POST["ConfirmPassword"];
  7. $match=($pwd==$pwdConfirm);
  8. $conn=new mysqli("localhost","root","123","UseCase");
  9. if (mysqli_connect_errno()) {
  10. printf("Connect failed: %s\n", mysqli_connect_error());
  11. exit();
  12. }
  13. $query="insert into User(UserName,Password) values(?,?)";
  14. $stmt=$conn->stmt_init();
  15. $stmt->prepare($query);
  16. $stmt->bind_param('ss',$name,$pwd);
  17. $name=$_POST["UserName"];
  18. $pwd=$_POST["Password"];
  19. $stmt->execute();
  20. if($stmt->errno==0) {
  21. $success=true;
  22. }else {
  23. $success=false;
  24. }
  25. $stmt->close();
  26. $conn->close();
  27. }
  28. ?>
复制代码

其中bind_param方法需要稍微解释下,第一个参数的含义是参数类型。每个字符对应一个参数,s表示字符串,i表示整数,d表示浮点数,b表示blob。最后,再为这个页面添加一点提示信息:
代码如下:

  1. <?php
  2. if(!$match) { ?>
  3. <p>Password and Confirm Password must match.</p>
  4. <?php
  5. }
  6. ?>
  7. <?php
  8. if(isset($success)) {
  9. if($success) {
  10. echo '<p>User Created Successfully!';
  11. }elseif($sucess==false) {
  12. echo '<p>User Name existed.';
  13. }
  14. }
  15. ?>
复制代码

再接下来,我们编写一个用户列表页面。
代码如下:

  1. <table>
  2. <tr><th>User Name</th><th>CreateTime</th><th>Action</th>
  3. </tr>
  4. <?php
  5. include 'conn.php';
  6. $query="select * from User;";
  7. $res=$mysql->query($query);
  8. while($row=$res->fetch_array()) {
  9. ?>
  10. <tr>
  11. <td><?= $row['UserName'] ?></td>
  12. <td><?= date('Y-m-d',strtotime($row['CreateTime']))?></td>
  13. <td><a href="UserEdit.php?action=update&ID=<?= $row['UserName'] ?>">Edit</a>
  14. <a href="action=delete&ID=<?= $row['UserName'] ?>">Delete</a>
  15. </td>
  16. </tr>
  17. <?php
  18. }
  19. $res->close();
  20. $mysql->close();
  21. ?>
  22. </table>
复制代码

authicon 不知足阁 发表于 2011-4-8 15:31:53 | 显示全部楼层
收藏一下。以后学习
authicon 小小飞象 发表于 2011-4-13 08:45:48 | 显示全部楼层
谢谢分享啊
authicon 馥郁渊汀 发表于 2011-6-22 18:00:11 | 显示全部楼层
这个要顶起来啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 19:04

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表