①.、接口的定义:
接口:一种成员属性为抽象的特殊抽象类,在程序中同为规范的作用
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
class BaseShop implements Shop { public function buy($gid) { echo('你购买了ID为 :'.$gid.'的商品'); } public function sell($gid) { echo('你卖了ID为 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID为 :'.$gid.'的商品'); } }
结论 : PHP接口类interface就是一个类的领导者,指明方向,子类必须完成它指定方法.这样不同的开发者就不要去了解别人怎么命名相应的方法.
我们都知道PHP中的类(class)是单继承的,那是不是就没有办法实现多重继承了呢?答案是否定的.我们可以通过其它特殊的方式实现类的多重 继承,比如使用接口(interface)实现,只要把类的特征抽象为接口,并通过实现接口的方式让对象有多重身份,通过这样就可以模拟多重继承了.
下面是一个用接口(interface)实现多重继承的例子,源代码如下:
php
interface UserInterface{ //定义User的接口
function getname();
interface TeacherInterface{ //teacher相关接口
function getLengthOfService();
class User implements UserInterface { //实现UserInterface接口
private $name = "tom";
public function getName(){
return $this-name;
class Teacher implements TeacherInterface { //实现TeacherInterface接口
public function getLengthOfService(){
return $this-lengthOfService;
// 继承自User类,同时实现了TeacherInterface接口.
class GraduateStudent extends User implements TeacherInterface {
private $teacher ;
public function __construct(){
$this-teacher = new Teacher();
return $this-teacher-getLengthOfService();
class Act{
//注意这里的类型提示改成了接口类型
public static function getUserName(UserInterface $_user){
echo "Name is " . $_user-getName() ."br";
//这里的类型提示改成了TeacherInterface类型.
public static function getLengthOfService(TeacherInterface $_teacher){
echo "Age is " .$_teacher-getLengthOfService() ."br";
$graduateStudent = new GraduateStudent();
Act::getUserName($graduateStudent);
Act::getLengthOfService($graduateStudent);
//结果正如我们所要的,实现了有多重身份的一个对象.
示例运行结果如下:
Name is tom
抽象类 :1.类中至少有一个抽象方法
接口: 1.成员属性为常量const
①本身不能被实例化,必须继承或者引用
关键字 interface.引用关键字 implements
PHP入门基础教程大全
①.、嵌入方法:
类似ASP的%,PHP可以是?php或者是?,结束符号是?,当然您也可以自己指定.
引用文件的方法有两种:require 及 include.
require 的使用方法如 require("MyRequireFile.php"); .这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份.常用的函数,亦可以这个方法将它引入网页中.
include 使用方法如 include("MyIncludeFile.php"); .这个函数一般是放在流程控制的处理部分中.PHP 程序网页在读到 include 的文件时,才将它读进来.这种方式,可以把程序执行时的流程简单化.
echo "这是第一种例子.\n" ; // 本例是 C◆◆ 语法的注释 (PHP的注释跟C差不多!)
/* 本例采用多行的
注释方式 */
echo "这是第二种例子.\n" ;
echo "这是第三种例子.\n" ; # 本例使用 UNIX Shell 语法注释
$mystring = "我是字符串" ;
$NewLine = "换行了\n" ;
$MyArray1 = array( "子" , "丑" , "寅" , "卯" );
这里引出两个问题,首先PHP变量以$开头,第二PHP语句以;结尾,可能ASP程序员会不适应.这两个遗漏也是程序上大多错误所在.
数**非法字眼已被屏蔽**算:
符号 ? ? 意义
◆ ? ? ? 加法运算
- ? ? ? ?减法运算
* ? ? ? ?乘法运算
/ ? ? ? ?除法运算
% ? ? ?取余数
◆◆ ? ? 累加
-- ? ? ? 递减
字符串运算:
运算符号只有一个,就是英文的句号.它可以将字符串连接起来,变成合并的新字符串.类似ASP中的
$b = "功能强大" ;
echo $a.$b;
这里也引出两个问题,首先PHP中输出语句是echo,第二类似ASP中的%=变量%,PHP中也可以?=变量?.
逻辑运算:
符号 意义
小于
大于
= 小于或等于
= 大于或等于
== 等于
!= 不等于
而且 (And)
and 而且 (And)
或者 (Or)
or 或者 (Or)
xor 异或 (Xor)
! 不 (Not)
学习目的:掌握php的流程控制
①.、if..else 循环有三种结构
第一种是只有用到 if 条件,当作单纯的判断.解释成 "若发生了某事则怎样处理".语法如下:
if (expr) { statement }
其中的 expr 为判断的条件,通常都是用逻辑运算符号当判断的条件.而 statement 为符合条件的执行部分程序,若程序只有一行,可以省略大括号 {}.
范例:本例省略大括号.
if ($state==1)echo "哈哈" ;
这里特别注意的是,判断是否相等是==而不是=,ASP程序员可能常犯这个错误,= 是赋值.
范例:本例的执行部分有三行,不可省略大括号.
if ($state==1) {
echo "哈哈 ;
echo "br" ;
第两种是除了 if 之外,加上了 else 的条件,可解释成 "若发生了某事则怎样处理,否则该如何解决".语法如下
echo "哈哈" ;
echo "br";
else{
echo "呵呵";
第三种就是递归的 if..else 循环,通常用在多种决策判断时.它将数个 if..else 拿来合并运用处理.
直接看下面的例子
if ( $a $b ) {
echo "a 比 b 大" ;
} elseif ( $a == $b ) {
echo "a 等于 b" ;
} else {
echo "a 比 b 小" ;
上例只用二层的 if..else 循环,用来比较 a 和 b 两个变量.实际要使用这种递归 if..else 循环时,请小心使用,因为太多层的循环容易使设计的逻辑出问题,或者少打了大括号等,都会造成程序出现莫名其妙的问题.
下例是用 for 循环写的的例子.
for ( $i = 1 ; $i = 10 ; $i ◆◆) {
echo "这是第".$i."次循环br" ;
语法如下
其中的 expr 条件,通常为变量名称.而 case 后的 exprN,通常表示变量值.冒号后则为符合该条件要执行的部分.注意要用 break 跳离循环.
switch ( date ( "D" )) {
case "Mon" :
echo "今天星期一" ;
break;
case "Tue" :
echo "今天星期二" ;
case "Wed" :
echo "今天星期三" ;
case "Thu" :
echo "今天星期四" ;
case "Fri" :
echo "今天星期五" ;
default:
echo "今天放假" ;
这里需要注意的是break;别遗漏了,default,省略是可以的.
很明显的,上述的例子用 if 循环就很麻烦了.当然在设计时,要将出现机率最大的条件放在最前面,最少出现的条件放在最后面,可以增加程序的执行效率.上例由于每天出现的机率相同,所以不用注意条件的顺序.
学会构建数据库
下面说一下它的使用.
进入了phpmyadmin后,我们首先需要建立一个数据库,
然后在左边下拉菜单中选择那个已经创建的数据库.在下面的
在数据库 shop 中创建一个新表 :
名字 :
字段数 :
中填写表名字和大致你认为的字段数(不够或者多了都不要紧,以后可以再添加或者缺省),按执行.
然后就可以开始建立表了.
第一栏是字段的名字;第二栏选择字段类型:
我们常用的是以下几个:
①.)VARCHAR,文本类型
①.)按右边的结构:查看修改表结构
还有一个很重要的功能就是导入和导出,当我们本机做好了程序和数据库的时候,需要在服务器上也有一个本地镜像,如果是ASP的ACCESS简单了,直接上传MDB文件即可,如果是SQL SERVER也可以连接远端服务器进行导入.那么MY SQL中你可以导出所有的SQL语句,到了远端服务器的PHPMYADMIN上,创建数据库后按SQL,粘帖你刚才复制下来的所有本级生成的SQL语句即可.
学会连接数据库
PHP简直就是一个函数库,丰富的函数使PHP的某些地方相当简单.建议大家down一本PHP的函数手册,总用的到.
我这里就简单说一下连接MYSQL数据库.
①.、mysql_connect
打开 MySQL 服务器连接.
语法: int mysql_connect(string [hostname] [:port], string [username], string [password]); 返回值: 整数
本函数建立与 MySQL 服务器的连接.其中所有的参数都可省略.当使用本函数却不加任何参数时,参数 hostname 的默认值为 localhost、参数 username 的默认值为 PHP 执行行程的拥有者、参数 password 则为空字符串 (即没有密码).而参数 hostname 后面可以加冒号与端口号,代表使用哪个端口与 MySQL 连接.当然在使用数据库时,早点使用 mysql_close() 将连接关掉可以节省资源.
选择一个数据库.
语法: int mysql_select_db(string database_name, int [link_identifier]); 返回值: 整数
本函数选择 MySQL 服务器中的数据库以供之后的资料查询作业 (query) 处理.成功返回 true,失败则返回 false.
最简单的例子就是:
mysql_select_db("shop");
连接机MY SQL数据库,打开SHOP数据库.在实际应用中应当加强点错误判断.
学会读取数据
先看两个函数:
①.、mysql_query
送出一个 query 字符串. 语法: int mysql_query(string query, int [link_identifier]); 返回值: 整数
本函数送出 query 字符串供 MySQL 做相关的处理或者执行.若没有指定 link_identifier 参数,则程序会自动寻找最近打开的 ID.当 query 查询字符串是 UPDATE、INSERT 及 DELETE 时,返回的可能是 true 或者 false;查询的字符串是 SELECT 则返回新的 ID 值,当返回 false 时,并不是执行成功但无返回值,而是查询的字符串有错误.
本函数用来将查询结果 result 拆到类变量中.若 result 没有资料,则返回 false 值.
看一个简单的例子:
$exec="select * from user";
$result=mysql_query($exec);
while($rs=mysql_fetch_object($result))
echo "username:".$rs-username."br";
当然,表user中有一个username的字段,这就类似asp中的
%
exec="select * from user"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
do while not rs.eof
response.write "username:"rs("username")"br"
rs.movenext
loop
当然先要连接数据库,一般我们 require_once('conn.php');而conn.php里面就是上一次说的连接数据库的代码.
小小的两条命令可以完成读取数据的工作了
学会添加删除修改数据
mysql_query($exec);
单这个语句就可以执行所有的操作了,不同的就是$exec这个sql语句
删除:$exec="delete from tablename where...";
修改:$exec="update tablename set item1='".$_POST['item1']."' where ...";
说到这里就要说一下表单和php变量传递,如果表单中的一个 input name="item1" type="text" id="item1"
表单以POST提交的,那么处理表单文件就可以用$_POST['item1']得到变量值,同样以GET提交的就是$_GET['item1']
是不是很简单?但是通常$exec会有问题,因为可能您的SQL语句会很长,您会遗漏.连接符,或者'来包围字符型字段.
我们可以注释mysql_query($exec);语句用echo $exec;代替来输出$exec以检查正确性.如果您还不能察觉$exec有什么错误的话,可以复制这个sql语句到phpmyadmin中执行,看看它的出错信息.还有需要注意的是,我们不要使用一些敏感的字符串作为字段名字,否则很可能会出现问题,比如说date什么的.变量的命名,字段的命名遵循一点规律有的时候对自己是一种好处,初学者并不可忽视其重要性.
学会SESSION的使用
SESSION的作用很多,最多用的就是站点内页面间变量传递.
在页面开始我们要session_start();开启SESSION;
然后就可以使用SESSION变量了,比如说要赋值就是:$_SESSION['item']="item1";要得到值就是$item1=$_SESSION['item'];,很简单吧.这里我们可能会使用到一些函数,比如说判断是不是某SESSION变量为空,可以这么写:empty($_SESSION['inum'])返回true or false.
下面综合一下前面所说的我们来看一个登陆程序,判断用户名密码是否正确.
登陆表单是这样:login.php
table width="100%" height="100%" border="0" align="center" cellpadding="0" cellspacing="0"
tr
tr class="tdbg"
/tr
tdp align="center"Username/p/td
tdp align="center"
input name="username" type="text" id="username"
/p/td
tdp align="center"Password/p/td
input name="password" type="password" id="password"
input type="submit" name="Submit" value="Submit"
/table/td/form
/table
处理文件是这样
require_once('conn.php');
session_start();
$username=$_POST['username'];
$password=$_POST['password'];
$exec="select * from admin where username='".$username."'";
if($result=mysql_query($exec))
if($rs=mysql_fetch_object($result))
if($rs-password==$password)
$_SESSION['adminname']=$username;
header("location:index.php");
else
echo "scriptalert('Password Check Error!');location.href='login.php';/script";
echo "scriptalert('Username Check Error!');location.href='login.php';/script";
echo "scriptalert('Database Connection Error!');location.href='login.php';/script";
conn.php是这样:
由于 $_SESSION['adminname']=$username;我们可以这样写验证是否登陆语句的文件:checkadmin.php
if($_SESSION['adminname']=='')
echo "scriptalert('Please Login First');location.href='login.php';/script";
做一个分页显示
关键就是用到了SQL语句中的limit来限定显示的记录从几到几.我们需要一个记录当前页的变量$page,还需要总共的记录数$num
对于$page如果没有我们就让它=0,如果有0就让它也=0,如果超过了总的页数就让他=总的页数.
$execc="select count(*) from tablename ";
$resultc=mysql_query($execc);
$rsc=mysql_fetch_array($resultc);
$num=$rsc[0];
这样可以得到记录总数
ceil($num/10))如果一页10记录的话,这个就是总的页数
所以可以这么写
if(empty($_GET['page']))
$page=0;
$page=$_GET['page'];
if($page0)$page=0;
if($page=ceil($num/10))$page=ceil($num/10)-1;//因为page是从0开始的,所以要-1
这样$exec可以这么写 $exec="select * from tablename limit ".($page*10).",10";
//一页是10记录的
最后我们需要做的就是几个连接:
a href="xxx.php?page=0"FirstPage/a
a href="xxx.php?page=?=($page-1)?"PrevPage/a
a href="xxx.php?page=?=($page◆1)?"NextPage/a
a href="xxx.php?page=?=ceil($num/10)-1?"LastPage/a
注意事项
①.、注意不要漏了分号
如果发生错误的时候,可以采用以下方法:
①.、如果是SQL语句出错,就注释了然后输出SQL语句,注意也要注释调后续的执行SQL语句
在做大网站的时候,我的思路是先构建数据库,确定每一个字段的作用,和表之间的关系.然后设计后台界面,从添加数据开始做起,因为添加是否成功可以直接到数据库里面验证,做好了添加再做显示的页面,最后才是两者的结合.一般来说后台就包括添加删除修改和显示,后台没有问题了,前台也没有什么大问题.前台还需要注意安全性和容错还有就是输出格式.
学会用PHP上传文件和发邮件
上传文件表单必须加上 enctype="multipart/form-data"
和 input type="file" name="file"
下面看一下代码:
$f=$HTTP_POST_FILES['file'];
$dest_dir='uploads';//设定上传目录
$dest=$dest_dir.'/'.date("ymd")."_".$f['name'];//我这里设置文件名为日期加上文件名避免重复
$r=move_uploaded_file($f['tmp_name'],$dest);
上传的文件名为date("ymd")."_".$f['name'] ,可以在以后插入到数据库的时候用到,PHP实际上是把你上传的文件从临时目录移动到指定目录.move_uploaded_file($f['tmp_name'],$dest);这是关键
至于发邮件就更加简单,可以使用mail()函数
mail("收件人地址","主题","正文","From:发件人\r\nReply-to:发件人的地址");
不过mail()需要服务器的支持,在WINDOWS下还需要配置SMTP服务器,一般来说外面的LINUX空间都行.
好像上传文件和发邮件比ASP简单很多,只要调用函数就可以了.ASP还需要用到服务器的不同组件比如FSO、JMAIL什么的.
;
php引用函数的使用方法
在技术学习的道路上,能掌握一些有用的技巧,对于初学者是非常有帮助的,下面是php引用函数的使用方法,希望大家会喜欢.
①不要在你的应用程序中gzip输出,让apache来做
考虑使用ob_gzhandler?不,别这样做.它没有任何意义.PHP应该是来写应用程序的.不要担心PHP中有关如何优化在服务器和浏览器之间传输的数据.
使用apache mod_gzip/mod_deflate通过.htaccess文件压缩内容.
有些时候一些JavaScript代码是从php动态生成的.
$images = array( 'myself.png' , 'friends.png' , 'colleagues.png');
$js_code = '';foreach($images as $image)
$js_code .= "'$image' ,";
$js_code = 'var images = [' . $js_code . ']; ';echo $js_code;//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];
放聪明点.使用json_encode:
$js_code = 'var images = ' . json_encode($images);
echo $js_code;//Output is : var images = ["myself.png","friends.png","colleagues.png"]
这不是很整洁?
在写入或保存任何文件之前,请务必要检查该目录是否是可写的,如果不可写的话,会闪烁错误消息.这将节省你大量的"调试"时间.当你工作于Linux时,权限是必须要处理的,并且会有很多很多的权限问题时,当目录不可写,文件无法读取等的时候.
请确保你的应用程序尽可能智能化,并在最短的时间内报告最重要的信息.
$contents = "All the content";
$file_path = "/var/www/project/content.txt";
file_put_contents($file_path , $contents);
这完全正确.但有一些间接的问题.file_put_contents可能会因为一些原因而失败:
父目录不存在
目录存在,但不可写
锁定文件用于写入?
所以呢,在写入文件之前最好能够一切都弄明确.
$dir = '/var/www/project';
$file_path = $dir . "/content.txt";if(is_writable($dir))
}else{ ? ?die("Directory $dir is not writable, or does not exist. Please check");
通过这样做,你就能得到哪里文件写入失败以及为什么失败的准确信息.
当在Linux环境下工作时,权限处理会浪费你很多时间.所以呢,只要你的php应用程序创建了一些文件,那就应该修改它们的权限以确保它们在外面"平易近人".否则,例如,文件是由"php"用户创建的,而你作为一个不同的用户,系统就不会让你访问或打开文件,然后你必须努力获得root权限,更改文件权限等等.
if($_POST['submit'] == 'Save')
{ ? ?//Save the things}
以上代码在大多数时候是正确的,除了应用程序使用多语言的情况.然后"Save"可以是很多不同的东西.那么你该如何再做比较?所以不能依靠提交按钮的值.相反,使用这个:
if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )
现在你就可以摆脱提交按钮的值了.
//Delay for some timefunction delay(){
$sync_delay = get_option('sync_delay'); ? ?echo "
Delaying for $sync_delay seconds...";
sleep($sync_delay); ? ?echo "Done
";
相反,使用静态变量:
//Delay for some timefunction delay(){ ? ?static $sync_delay = null; ? ?if($sync_delay == null)
$sync_delay = get_option('sync_delay');
} ? ?echo "
一些简单的例子是:
$_SESSION['username'] = $username;
$username = $_SESSION['username'];
所以呢,用包装函数使用应用程序特定键:
define('APP_ID' , 'abc_corp_ecommerce');//Function to get a session variablefunction session_get($key){
$k = APP_ID . '.' . $key; ? ?if(isset($_SESSION[$k]))
{ ? ? ? ?return $_SESSION[$k];
} ? ?return false;
}//Function set the session variablefunction session_set($key , $value){
$k = APP_ID . '.' . $key;
$_SESSION[$k] = $value; ? ?return true;
所以,你必须在一个文件中有很多实用函数:
function utility_a(){ ? ?//This function does a utility thing like string processing}function utility_b(){ ? ?//This function does nother utility thing like database processing}function utility_c(){ ? ?//This function is ...}
自由地在应用程序中使用函数.那么你或许想要将它们包装成一个类作为静态函数:
class Utility{ ? ?public static function utility_a()
} ? ?public static function utility_b()
} ? ?public static function utility_c()
}//and call them as $a = Utility::utility_a();
$b = Utility::utility_b();
这里你可以得到的一个明显好处是,如果php有相似名称的内置函数,那么名称不会发生冲突.
从另一个角度看,你可以在相同的应用程序中保持多个版本的相同类,而不会发生任何冲突.因为它被封装了,就是这样.
使用echo代替print
使用str_replace代替preg_replace,除非你确定需要它
不要使用short tags
对于简单的'字符串使用单引号代替双引号
在header重定向之后要记得做一个exit
千万不要把函数调用放到for循环控制行中.
isset比strlen快
正确和一致地格式化你的代码
不要丢失循环或if-else块的括号.
不要写这样的代码:
if($a == true) $a_count◆◆;
这绝对是一种浪费.
这样写
if($a == true)
$a_count◆◆;
①.0. 使用array_map快速处理数组
比方说,你要trim一个数组的所有元素.新手会这样做:
foreach($arr as $c = $v)
$arr[$c] = trim($v);
但它可以使用array_map变得更整洁:
$arr = array_map('trim' , $arr);
这适用于trim数组$arr的所有元素.另一个类似的函数是array_walk.
①.1.使用php过滤器验证数据
你是不是使用正则表达式来验证如电子邮件,IP地址等值?是的,每个人都是这样做的.现在,让我们试试一个不同的东西,那就是过滤器.
php过滤器扩展程序将提供简单的方法来有效验证或校验值.
$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];
这是一种好习惯.
set_error_handler()可以用来设置自定义的错误处理程序.在文件中编写一些重要的错误用于日志是个好主意.
大型的数组或字符串,如果一个变量保存了一些规模非常大的东西,那么要小心处理.常见错误是创建副本,然后耗尽内存,并得到内存溢出的致命错误:
当导入csv文件或导出表到csv文件时,上面这样的代码很常见.
像上面这样做可能经常会由于内存限制而让脚本崩溃.对于小规模的变量它不会出现问题,但当处理大型数组时一定要对此加以避免.
考虑通过引用传递它们,或者将它们存储在一个类变量中:
$a = get_large_array();
pass_to_function($a);
这样一来,相同的变量(并非其副本)将用于该函数.
class A{ ? ?function first()
{ ? ? ? ?$this-a = get_large_array(); ? ? ? ?$this-pass_to_function();
} ? ?function pass_to_function()
{ ? ? ? ?//process $this-a
尽快复原它们,这样内存就能被释放,并且脚本的其余部分就能放松.
下面是关于如何通过引用来赋值从而节省内存的一个简单示例.
error_reporting(E_ALL);
$a = array();for($i = 0; $i 100000 ; $i◆◆)
$a[$i] = 'A'.$i;
}echo 'Memory usage in MB : '. memory_get_usage() / 1000000 . '
';
$b = $a;
$b[0] = 'B';echo 'Memory usage in MB after 1st copy : '. memory_get_usage() / 1000000 . '
$c = $a;
$d = $a;
请确保你在整个脚本使用单一的数据库连接.从一开始就打开连接,使用至结束,并在结束时关闭它.不要像这样在函数内打开连接:
function add_to_cart(){
$db = new Database();
$db-query("INSERT INTO cart .....");
}function empty_cart(){
$db-query("DELETE FROM cart .....");
有多个连接也不好,会因为每个连接都需要时间来创建和使用更多的内存,而导致执行减缓.
在特殊情况下.例如数据库连接,可以使用单例模式.