PHP5新特性,__autoload
因为创建PYTHON中国(www.okpython.com)和推广PYTHON,所以一直没时间去研究PHP5的特性,现在终于有时间了。
今天说下__autoload函数的功能:
说明:自动加载类文件到本文件。
我们在用PHP4的时候一般用类的过程应该是这样的:
类文件加载require(类.php)
或include(类.php)
$test = new 类名
然后使用类方法。
php5以后就不用了,因为PHP5提供了一个简洁方便的方法,那就是autoload
具体举例说明:
test.php类文件(用与自动加载)
代码:
<?PHP
class test{//类开始
function echo_str(){print "this is test files";}
}//类结束
?>
testone.php文件代码:
<?PHP
$a = new test;
$a->echo_str();
function __autoload(strtolower($className)){ //strtolower是自动转化为小写字母(当然你可以不用strtolower,因为php5会自动将其转化为小写的)
require_once($className.".php"); //自动加载类文件,根据类的名称给予文件名(即为加载规则)
}
?>
运行testone.php,output "this is test files"本文原创文章,如若转载请注明出处.python中国www.okpython.com
PHP 5.3 介绍
PHP 2008 魁北克- Ilia Alshanetsky
. 新版本的特性
* 兼职老版本下的代码
* 重点主要放在现有的功能的改进
* 更少的bug
* 更快的发布周期
1. 命名空间(Namespaces)
* PHP5.3最大的新功能
* 完全支持名字空间特征
* 大部分的功能的执行在编译时
* 简化命名惯例
1) 更清晰的代码
不使用 Namespaces
function MY_wrapper() {}
class MY_DB {}
define(''MY_COMM_STR'', '''');
MY_wrapper();
new MY_DB();
MY_COMM_STR;
2) 使用 Namespaces
namespace MY;
function wrapper() {}
class DB { }
const CONN_STR = '''';
use MY AS MY;
wrapper();
new DB();
CONN_STR;
3) 一个文件中多个名字空间
namespace LIB;
class MYSQL {}
class SQLite {}
$b = new SQLite(;
namespace LIB_EXTRA;
class MScrypt {}
$a new MScrypt();
var_dump(
get_class($a),
get_class($b)
};
// result:
// string(18) "LIB_EXTRA::MScrypt"
// string(11) "LIB::SQLite"
4) 名字空间的层级
namespace foo;
function strlen($foo) { return htmlspecialchars($foo); }
echo strlen("test"); // test
echo ::strlen("test") // 4
echo namespace::strlen("test"); // test
* function, class 和 constant 引用在一个名字空间中首先指向这个名字空间, 其次才是一个全局的范围
5) 名字空间 & 自动引入
function __autoload($var) { var_dump($var); } // LIB::foo
require "./ns.php";
/**
<?php
namespace LIB;
new foo();
?>
*/
* __autoload() 将处理为和名字空间的类名一起。
* autoload 仅在 class 不在名字空间和全局范围内存在时触发。
* __autoload() 声明在一个名字空间中将不别调用!
6) 其他的名字空间的语法技巧
namespace really::long::pointlessly::verbose::ns;
__NAMESPACE__; // 当前的名字空间名称
class a {}
get_class( new a() ); // really::long::pointlessly::verbose::ns::abs
use really::long::pointlessly::verbose::ns::a AS b; // 从一个名字空间引用class
2. 改进的性能
* md5() 速度提高了大概10-15%
* 引擎中更好的堆栈实现
* 常量移到只读内存区
* 改进Exception处理(更简单 & 更少的代码)
* 调用 (require/include)_once 去掉了使用open(2)(linux下的c函数)
* 使用gcc4编译的二进制更小更快
整体性能提高 5-15%
3. 新的语言特性
1) __DIR__
* 引入 __DIR__ magic常量 定位脚本的目录
echo dirname(__FILE__); // < PHP 5.3
/* vs */
echo __DIR__; // >= 5.3
2) ?: 操作符
* 允许从2个值的or/and表达式快速的获取一个非空的值
$a = true ?: false; // true;
$a = false ?: true; // true;
$a = "" ?: 1; // 1
$a = 0 ?: 2; // 2
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a"); // 1
3) __callStatic()
* 等价于 __call() , 但它是为调用静态方法准备的
class helper
{
static function __callStatic($name, $args){
echo $name.''(''.implode('','' $args).'')'';
}
}
helper::test("foo", "bar"); // test(foo,bar);
// 动态的函数/方法调用有点慢...
4) 动态的调用静态方法
* php 现在允许 动态的调用静态的方法
class helper
{
static function foo(){
echo __METHOD__;`
}
}
$a = "helper";
$b = "foo";
$a::$b(); // helper::foo
// 动态的函数/方法调用有点慢...
5) 延迟静态绑定
* 静态处理从编译时延迟到执行时
class A
{
public static function whoami(){
echo __CLASS__;
}
public static function identity(){
self::whoami();
}
}
class B extends A
{
public static function whoami(){
echo __CLASS__;
}
}
B::identity(); // A <-- php < 5.3
class A
{
public static function whoami(){
echo __CLASS__;
}
public static function identity(){
static::whoami();
}
}
class B extends A
{
public static function whoami(){
echo __CLASS__;
}
}
B::identity(); // B <-- php >= 5.3
* 小心使用操作码缓存,没有向后兼容
6) MySQLInd
* 特殊的,高速的专门为PHP设计的MySQL调用库接口
* 更好的性能
* 内存的使用优化
* 内置的驱动(不是适应性的再次扩展)
* Many future options due to tight integration with PHP
* 目前还没有PDO_MySQL 支持 mysql(i) only for now
7) INI Magic
* CGI/FastCGI 支持".htaccess" 形式的INI控制
* 用户可以自己设定每个目录的INI在php.ini中通过[PATH=/var/www/domain.com]设定
* 优化错误处理
* 允许用户使用INI变量和常量任何定义的INI文件中
* 其他几个小的优化
用户自定义的php.ini(.htaccess) 文件名. 默认为".user.ini"
user_ini.filename = ".user.ini"
禁止这个特性 设置这个选项为空值
用户自定义php.ini 的缓存失效期(time-to-live) 秒数. 默认is 300s (5分钟)
user_ini.cache_ttl = 300s
[PATH=/var/www/domain.com]
variables_order = GPC
safe_mode = 1
[my varibles]
somevar = "1234"
anothervar = ${somevar} ; anothervar == somevar
[ini arrays]
foo[bar] = 1
foo[123] = 2
foo[] = 3
8) 扩展的 OpenSSL 函数
* 使用 OpenSSL Digest 函数
foreach (openssl_get_md_methods() as $d) {// MD4, MD5, SHA512... (12 all in all)
echo $d. " - ". openssl_digest("foo", "md5"); // acbd18db4cc2f85cedef654fccc4a4d8
}
* 使用 OpenSSL 加密函数
// BF-CBC, AES-256 CFB1... (54 all in all)
foreach(openssl_get_cipher_methods() as $v) {
$val = openssl_encrypt("value", $v, "secret");
openssl_decrypt($val, $v, "secret"); // value
}
* 扩展的 openssl_pkey_new() 和 openssl_pkey_get_details()
函数 允许访问 内部的 DSA, RSA 和 DH 密匙.
其目标在PHP中实现一个简单的OpenId
9) SPL(Standard PHP Library) 优化
* 优化嵌套的目录迭代次数由文件系统迭代
* 引入 GlobIterator
* 各种各样的数据结构类: 双链表, 堆栈, 队列, 堆, 小型堆, 大型堆, 优先级队列
* 其他的很绕口的一些特征
10) 时间处理进行扩展了和添加
* 可控制的 strtotime() 由 date_create_from_format()实现
$date = strtotime("08-01-07 00:00:00");
var_dump(date("Y-m-d", $date)); // string(10) "2008-01-07"
$date = date_create_from_format("m-d-y", "08-01-07");
var_dump($date->format(''Y-m-d'')); // string(10) "2007-08-01"
* 添加了 date_get_last_errors(),并且返回时间语法分析的错误和警告
array(4) {
["warning_count"] => int(0)
["warnings"] => array(0) { }
["error_count"] => int(2)
["errors"]=>
array(2) {
[2]=> string(40) "The separation symbol could not be found"
[6]=> string(13) "Trailing data"
}
}
11) getopt() 优化
* 影响 Windows 平台
* 本地的执行不依赖于本地getopt()实现.
* 跨平台支持长选项 (--option)
// input: --a=foo --b --c
var_dump(getopt("", array("a:","b::","c")));
/* output: array(3) {
["a"]=>
string(3) "foo"
["b"]=>
bool(false)
["c"]=>
bool(false)
} */
12) XSLT Profiling
* 引入 Xslt Profiling 通过 setProfiling()实现
$xslt = new xsltprocessor();
$xslt->importStylesheet($xml);
$xslt->setProfiling("/tmp/profile.txt");
$xslt->transformToXml($dom);
Resulting In:
number match name mode Calls Tot 100us Avg
0 date 5 58 11
Total 5 58
13) E_DEPRECATED 标记
* 怎么样将一个php发行为一个没有错误的模式? 废弃
* E_DEPRECATED用来指定废弃的功能,或许未来的版本中会消除。
14) 垃圾回收器
* 为复杂和长时间运行脚本的执行结束周期释放内存的清理
gc_enable(); // 允许垃圾回收
var_dump(gc_enabled()); // true
var_dump(gc_collect_cycles()); // 某个元素的清理
gc_disable(); // 禁止垃圾回收
15) NOWDOC
* 一个 HEREDOC 不再进行转译
HEREDOC
$foo = <<<ONE
this is $fubar
ONE;
/* string(10) "this is" */
NOWDOC
$bar = <<<‘TWO’
this is $fubar
TWO;
/* string(16) "this is $fubar" */
4. 其他优化
* SQLite 升级到 3.5.6
* 40 多个bug 被修复
* CGI/FastCGI SAPI 优化
* 各种流的优化
* 未来更多的优化
更新日期:2008-03-04
受影响系统:
phpMyAdmin phpMyAdmin < 2.11.5
不受影响系统:
phpMyAdmin phpMyAdmin 2.11.5
描述:
BUGTRAQ ID: 28068
phpMyAdmin是用PHP编写的工具,用于通过WEB管理MySQL。
phpMyAdmin使用$_REQUEST而不是$_GET和$_POST变量作为其参数来源,并且在SQL查询中未经过滤便使用了参数,如果用户受骗访问了恶意网站的话,就可能导致SQL注入攻击。
phpMyAdmin:目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.5-all-languages.tar.bz2?download
在做项目中要用到ACCESS数据库,所以就写了一个ACCESS处理类.函数名跟ADODB类一样.
<?php
/*
*ACCESS数据库操作类
*2008-3-26
*LIQUAN
*$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".PATH_ROOT."databasedata.mdb";
*$conn=new Access();
*$conn->Connnect($dsn);
*$conn->GetArray("select * from test");
*/
class Access
{
var $conn;
var $fieldsName;
function Access()
{
}
//connection
function Connect($dsn)
{
$this->conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$this->conn->Open($dsn);
}
//返回一个
function GetOne($sql)
{
$rs = $this->conn->Execute($sql);
while (!$rs->EOF)
{
$value=$rs->Fields(0)->value;
$rs->MoveNext();
}
$rs->Close();
$rs=null;
if(!empty($value))
{
return $value;
}
else
{
return "";
}
unset($value);
}
//返回大数组
function GetArray($sql)
{
$rs = $this->conn->Execute($sql);
$num_columns = $rs->Fields->Count();
$rowcount = 0;
while (!$rs->EOF)
{
for ($i=0; $i < $num_columns; $i++)
{
$fieldName[$rowcount][$rs->Fields($i)->name]= $rs->Fields($i)->value;
}
$rowcount++;
$rs->MoveNext();
}
$rs->Close();
$rs=null;
if(!empty($fieldName))
{
return $fieldName;
}
else
{
return "";
}
unset($fieldName);
}
//返回小数组
function GetRow($sql)
{
$rs = $this->conn->Execute($sql);
$num_columns = $rs->Fields->Count();
while (!$rs->EOF)
{
for ($i=0; $i < $num_columns; $i++)
{
$fieldName[$rs->Fields($i)->name]=$rs->Fields($i)->value;
}
$rs->MoveNext();
}
$rs->Close();
$rs=null;
if(!empty($fieldName))
{
return $fieldName;
}
else
{
return "";
}
unset($fieldName);
}
//execute SQL
function Execute($sql)
{
if($this->conn->Execute($sql))
{
return true;
}
else
{
return false;
}
}
function Close()
{
$this->conn->Close();
}
function __destruct()
{
// $this->conn->Close();
}
}
?>
<?php
$d=array(
array("a",-20319),
array("ai",-20317),
array("an",-20304),
array("ang",-20295),
array("ao",-20292),
array("ba",-20283),
array("bai",-20265),
array("ban",-20257),
array("bang",-20242),
array("bao",-20230),
array("bei",-20051),
array("ben",-20036),
array("beng",-20032),
array("bi",-20026),
array("bian",-20002),
array("biao",-19990),
array("bie",-19986),
array("bin",-19982),
array("bing",-19976),
array("bo",-19805),
array("bu",-19784),
array("ca",-19775),
array("cai",-19774),
array("can",-19763),
array("cang",-19756),
array("cao",-19751),
array("ce",-19746),
array("ceng",-19741),
array("cha",-19739),
array("chai",-19728),
array("chan",-19725),
array("chang",-19715),
array("chao",-19540),
array("che",-19531),
array("chen",-19525),
array("cheng",-19515),
array("chi",-19500),
array("chong",-19484),
array("chou",-19479),
array("chu",-19467),
array("chuai",-19289),
array("chuan",-19288),
array("chuang",-19281),
array("chui",-19275),
array("chun",-19270),
array("chuo",-19263),
array("ci",-19261),
array("cong",-19249),
array("cou",-19243),
array("cu",-19242),
array("cuan",-19238),
array("cui",-19235),
array("cun",-19227),
array("cuo",-19224),
array("da",-19218),
array("dai",-19212),
array("dan",-19038),
array("dang",-19023),
array("dao",-19018),
array("de",-19006),
array("deng",-19003),
array("di",-18996),
array("dian",-18977),
相关文章
- 这篇文章主要介绍了C# 10个常用特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-09
JavaScript中的Reflect对象详解(ES6新特性)
这篇文章主要介绍了JavaScript中的Reflect对象(ES6新特性)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-29- 这篇文章主要介绍了C#语言主要特性总结,本文总结了C#语言的简单、现代、面向对象、类型安全、相互兼容性、可伸缩性和可升级性等几个主要特点,需要的朋友可以参考下...2020-06-25
- GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。下文给大家介绍MySQL 5.6 GTID新特性实践,感兴趣的朋友一起看看吧...2016-10-20
- 这篇文章主要介绍了ES6新特性之变量和字符串用法,结合具体实例形式分析了ES6中变量与字符串的特性、使用方法与相关注意事项,需要的朋友可以参考下...2017-04-03
- 这篇文章主要介绍了C++17新特性个人总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
这篇文章主要介绍了ES6新特性之类(Class)和继承(Extends)相关概念与用法,结合实例形式较为详细的分析了ES6中类(Class)和继承(Extends)的基本概念、语法、使用方法与注意事项,需要的朋友可以参考下...2017-05-27- 本文给大家讲解的是在laravel中是怎么实现autoload的?分析之后才发现,真的是很巧妙,下面就来给大家详细说明下...2017-05-21
- 这篇文章主要介绍了python3.9之你应该知道的新特性详解,需要的朋友可以参考下...2021-04-29
- 这篇文章主要介绍了ES6新特性之解构、参数、模块和记号用法,结合实例形式分析了解构、参数、模块和记号的功能、用法及相关使用注意事项,需要的朋友可以参考下...2017-04-03
- 从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下...2021-10-11
- 这篇文章主要给大家介绍了关于c#中string的特性介绍及注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 干货来袭! 为大家分享了C# 7.0 新特性,VS2017可用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- PHP7新特性foreach与前版本稍一些改变了,那么在PHP7新特性foreach到底作了什么改变呢,我们下面一起来看看PHP7新特性foreach 修改使用例子,希望文章能够帮助到大家。...2016-11-25
- 下面小编就为大家分享一篇asp.net使用H5新特性实现异步上传的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
- 本文主要介绍jQuery 3中一些新增的特性和一些变更的特性,以及一些废弃删除的特性,另外介绍了jQuery 3.0 最大的变化就是彻底放弃对 IE8 的支持,大家可以先看一下。...2016-04-17
- 这篇文章主要介绍了c# Newtonsoft 六个值得使用的特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了Java8特性使用Function代替分支语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-09
- 这篇文章主要介绍了MySQL8.0新特性——事务性数据字典与原子DDL的相关资料,帮助大家更好的理解和学习MySQL8.0感兴趣的朋友可以了解下...2020-08-26
- C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善。接下来通过本文给大家介绍C#7.0中新特性汇总,需要的朋友可以参考下...2020-06-25