- -> 用来在对象中访问它们自己的成员而范围操作符::用于在类中访问成员
ClassName::methodName() 和 ClassName::propertyName
1. 在使用类的时候,在父类和子类具有相同名称的属性和方法时,利用它可以避免混淆
2. 在类外的时候,在没有创建对象的情况下使用该操作符访问类的成员
当子类父类都有_initialize时,子类覆盖父类,如果子类没有_initialize,则继承父类
实际编写子类的构造函数时,一般都要加上父类构造函数的主动调用 parent::_ _construct(),否则会导致子类对象空指针的异常
在PHP中,创建一个对象的副本的时候,PHP其实只是创建了这个对象的一个引用,而不是复制整个新对象,也就是说两个变量会指向相同的东西,通过一个对象对其值的修改会影响到另一个对象。这意味着PHP使用引用来传递参数,而不是使用值。 如果真的需要两个分开的完全独立的对象,那么就需要创建一个对象的克隆 clone
common:
$a = new SomeClass();
$a->val = 1;
$b = $a;
$b->val = 2;
echo $a->val; //2
clone:
$a = new SomeClass();
$a->val = 1;
$b = clone $a;
$b->val = 2;
echo $a->val; //1
- 当不能确定在生成对象的时候其确切的对象类型且只有到程序运行的时候才能确定一般都可以用工厂模式,工厂模式通常是通过一个静态方法实现,工厂模式属于创建型模式,被用于产生一个或者多个对象
static function Create($type) {
//validate $type
return new SomeClassType();
}
组合模式属于结构型模式,适用于当我们的一个对象可能代表一个单一的实体,或者一个组合的实体(栗子:比如一个HTML表单包含一个或者多个表单元素,如果不用设计模式,要实现显示验证显示错误就需要在两个不同的类之中重复写很多一样的代码,其实比较具体的栗子就是CRUD)
连接数据库使用PDO,尽量不要使用原生的连接数据库的方法(mysql_connect #已被弃用 mysqli_connect),使用面向对象思想,但是注意的是要和try{}catch(){}一起食用
/*
DSN:mysql:dbname=test;host=localhost
*/
try{
$pdo = new PDO('DSN','USERNAME','PASSWORD'); // Data Source Name
} catch(PDOException $e) {
$e -> getMessage();
}
$q = 'select * from table where `id` = 1';
$pdo->exec($q); // 执行sql语句,不返回记录(select语句不能使用exec)
$id = $pdo->lastInsertId(); // 执行insert查询并且需要知道动态生成的主键值
$data = $pdo->quote($unsafe_data); //防止sql注入,处理查询语句
$results = $pdo -> query($q); //需要返回运行结果的查询(select)
$results -> rowCount(); // 查询返回多少条记录(与 mysqli_num_rows等价)
unset($pdo); // 关闭数据库连接
- 使用预定义语句,使得数据因为与查询分开传送,就不需要防范SQL注入,首先是要调用prepare(),查询语句中的动态数据用占位符(?)来代替
$stmt = $pdo -> prepare('select * from users WHERE email=? AND pass=SHA1(?)'); //占位符也可以用具名占位符来代替(:email :pass),不需要用引号引出来,返回PDOStatement类的对象
$stmt->execute(array('ssss@qq.com','mypass'));
- 打开网页并读取数据(csv文件)
CSV 逗号分割值(comma separated value):以纯文本形式存储表格数据,该文件是一个字符序列,不含必须像二进制数字那样被解读的数据,每条记录被分隔符分隔成字段
$fp = fopen($url,'r');
$read = fgetcsv($fp);
fclose($fp);
- 除了fopen()来访问网页,通过socket 可以实现和服务器的交互
URL编码
保留字符的百分号编码
! # $ & ’ ( ) * + , / : ; = ? @ [ ]
%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D
$fp = fsockopen($url,$port,$error_number,$error_string,$timeout);
//参数为 URL 端口号 存放错误编号的变量 存放错误信息字符串的变量 超时等待时间
/*
组成部分 : schema,host,port,user,pass,path,query,fragment
*/
$url_pieces = parse_url($url); // 解析url,返回其组成部分(关联数组)
parse_str(); //解析URL中的查询字符串,相当于解析query部分
fsockopen()函数相比fopen()函数的好处是fopen只会在PHP已经将allow_url_fopen设置为真的时候才能使用,而fsockopen()没有限制,所以用fsockopen不需要改php配置,通过一个socket连接,脚本可以很快的检查某个给定的URL是否有效
**一些常用的函数**
implode(’ ‘,str)//返回由数组元素组成的字符串,如str = [‘hello’,’world’,’!’];返回 hello world !
explode() // 把字符串打散为数组
gethostbyaddr() //通过一个IP获得对应的域名
当然cURL可以实现上面的任何一项功能
cURL工具可以传送接受cookie,处理文件上传,通过SSL连接工作,甚至处理FTP文件。
如果网页有HTTP身份验证保护,那么使用curl_setopt($url,CURLOPT_USERPWD,’username:password’);
- Web应用使用数据库提供的函数对数据进行加密和解密,MCrypt可以加密保存的数据,添加一层安全保护,加密进程创建了二进制数据之后,我们将会使用base64_encode()函数在保存加密数据之后将其转换成文本格式。
bin2hex() 将一个字符串值从二进制转换成十六进制
$m = mcrypt_module_open(alogorithm,algorithm_dir,mode,mode_dir);
MCrypt 包含多种算法(加密算子),每种算法以不同的方式对数据进行加密,运行mcrypt_list_algorithms()函数查看自己的MCrypt安装版本支持哪些加密算法
- 主要加密模式 : ECB CBC CFB OFB
PHP命令行
实现以下的一些任务
- 快速测试一些PHP代码
- 执行常规的维护操作
- 创建自己的系统工具
为PHP程序制作安装器
by vampirebitter