`
tiandirensoon
  • 浏览: 591816 次
文章分类
社区版块
存档分类
最新评论

PHP精华

 
阅读更多

1.PHP和JS交互

拼凑HTML

<? if(1==1):?>
<div id='search'></div>
<?endif?>


2.PHP字符串技巧


输出:Hello world. Day number 123

字符串连接小技巧

逗号,也可以和点号.一样连接字符串,同时性能上逗号还好一些,但是非常有限。

字符串保护变量的时候使用双引号。

substr() 函数返回字符串的一部分

substr(string,start,length)


输出:world!

strpos() 和strrpos()

strpos() 返回字符串在另一字符串中首次出现的位置【对大小写敏感】

stripos() 返回字符串在另一字符串中首次出现的位置【对大小写不敏感】

strrpos() 返回字符串在另一字符串中最后出现的位置【对大小写敏感】

strripos() 返回字符串在另一字符串中最后出现的位置【对大小写不敏感】

如果成功,则返回位置,否则返回 false。

输出:6

PHP界定符
<<<eot 和eot是界定符,他们之间的内容php将会识别为一段大的字符串,相当于""。


3.PHP数组技巧

http://www.cnblogs.com/kym/archive/2010/03/04/1678726.html


输出:

aa
bb
cc
dd
0
a-0
b-1
c-2
0-aa-
1-bb-
2-cc-
3-dd-

说明:对于foreach其实 用$key=>$value和$i => $g 是效果一样的,并不仅限于key value

reset() 函数

reset() 函数把数组的内部指针指向第一个元素,并返回这个元素的值。


输出:
Peter
Joe
Peter

array_fill()函数

用给定的值填充数组


输出:

Array
(
    [5]  => banana
    [6]  => banana
    [7]  => banana
    [8]  => banana
    [9]  => banana
    [10] => banana
)

4.打印数组(PHP模式和JSON模式)

输出:

Array ( [firstname] => Tom [lastname] => Smith [age] => 40 )

{"firstname":"Tom","lastname":"Smith","age":40}


输出:["1","2","3"]

说明:如果是一维数组json后是[],二维是{}

implode() 函数

implode() 函数把数组元素组合为一个字符串。


输出:

Hello World! Beautiful Day!

join() 函数是 implode() 函数的别名。

5.判断是否数组

if(is_array($ac))

6.类与引用


注意是$this->Name 不是$this->$Name

7.静态变量(不同于C#,java等的全局变量)

输出:2 4


8.函数中的静态成员

和$this不同,静态变量引用必须加$

9.常量

http://www.php.net/manual/zh/language.constants.php

//合法的常量名
define("FOO","something");

//使用

echo FOO

10.文件路径

dirname(__FILE__);//当前文件所在文件夹

dirname(dirname(__FILE__));//当前文件所在文件夹的上一层文件夹,这样如果是和当前路径平行的目录可以直接后面加上即可,如果是更上面的需要再网上回溯。

11.引入文件

require_once(dirname(__FILE__).文件名);//引入当前目录的某文件


12.执行远程文件

echo file_get_contents("http://www.baidu.com");

13.error_log记日志

$logfile = "/www/ws.txt";
$dd = '时间'.date("Y-m-d H:i:s").'| 来源:'.$_SERVER['HTTP_REFERER'].'| IP:'.$_SERVER['REMOTE_ADDR'].'|主机名:'.$_SERVER['REMOTE_HOST'] ;
error_log("{$dd}\r\n\r\n",3,$logfile);

14.常用时间


echo date('Ymd');
echo date("[Y-m-d H:i:s]");

15.sprintf() 函数

把格式化的字符串写写入一个变量中。

$str = "Hello";$number = 123;$txt = sprintf("%s world. Day number %u",$str,$number);

16.isset()函数

isset()函数一般用来检测变量是否设置,使用 unset() 释放变量之后,它将不再是 isset()。

empty()函数 判断值为否为空


17.class_exists陷阱

if(class_exists("类名"));

如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE

只要代码中有就是True,而不是new一个

18.implementsInterface

//如果该类实现 了IController接口
if($rc->implementsInterface('接口名'))

19.ReflectionClass

//利用反射api构造一个控制器类对应的反射类
$rc = new ReflectionClass(‘类名’);

20.hasMethod

//该类拥有解析后的action字符串所指向的方法名
if($rc->hasMethod('方法名'))

21.newInstance

//构造一个控制器类的实例
$controller = $rc->newInstance();

22.getMethod

获取该类$action参数所指向的方法对象
$method = $rc->getMethod('方法');

23.isStatic

//如果方法是静态的
if($rc->isStatic())

24.invoke

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象.使用反射api 来调用一个方法.

注意静态和非静态不同

if($plugin->hasMethod('getMenuItems')) {
/*实例化一个方法实例(注意当你将类和方法看成概念时,它们就可以有实例,
就像“人”这个概念一样),该方法返回的是ReflectionMethod 的实例*/
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果方法是静态的
if($reflectionMethod->isStatic()) {
//调用静态方法,注意参数是null 而不是一个反射类实例
$items = $reflectionMethod->invoke(null);
} else {
//如果方法不是静态的,则先实例化一个反射类实例所代表的类的实例。
$pluginInstance = $plugin->newInstance();
//使用反射api 来调用一个方法,参数是通过反射实例化的对象引用
$items = $reflectionMethod->invoke($pluginInstance);
}

25.explode()

可以讲字符串打散为数组的格式

explode(separator,string,limit)

参数分析:
separator:指定以什么字符来打散
string: 需要被打散的字符串
limit: 限制被打散的数组元素最多为多少个

26.chunk_split()

chunk_split() 函数能够把字符串分割为一块一块的更小的字符串块。
下面写了一个可以分割中文字符串的函数。

/**
* 分割字符串
* @param String $str 要分割的字符串
* @param int $length 指定的长度
* @param String $end 在分割后的字符串块追加的内容
* @param String $charset 字符编码,默认为utf-8
*/
function mb_chunk_split($str,$length, $end, $charset='utf-8')
{
if (empty($str)) return false;
if ( $charset != 'utf-8' ) $length = $length*2;
return chunk_split($str, $length, $end);
}


$str = '六一马上就要到了';
$str1 = 'aabbccddeefff';
echo mb_chunk_split($str, 2, '...', 'gb2312'); // 六一...马上...就要...到了...
echo mb_chunk_split($str1, 2, '...'); // aa...bb...cc...dd...ee...ff...f...

$str = 'one|two|three|four';
print_r(explode('|', $str, 2)); // Array( [0] => one [1] => two|three|four)

print_r(explode('|', $str, -1)); // Array( [0] => one [1] => two [2] => three)

27.microtime() 函数

microtime() 函数返回当前 Unix 时间戳和微秒数。

如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。

echo(microtime());

0.32491200 1321251369

28.die()函数

die() 函数输出一条消息,并退出当前脚本。

输出:

Warning: include(view.php) [function.include]: failed to open stream: No such file or directory in F:\website\test.php on line 21

Warning
: include() [function.include]: Failed opening 'view.php' for inclusion (include_path='.;C:\php5\pear') in F:\website\test.php on line 21
打不开文件view.php


如果注释第一句,其实第二句也是报错的,但是有第一句的情况下第二句就不会继续执行了,因为已经退出函数了。

29.set_time_limit(0)

语法 : void set_time_limit (int seconds)

说明 : 设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误。它预设的限制时间是30秒,max_execution_time的值定义在结构档案中(在PHP3中叫做php3.ini,在PHP4则叫做php.ini),如果将秒数设为0,表示无时间上的限制。

30.or的用法

function a()
{
return true;
}

a()
or print 'no request';

因为a()为真所以没有后面的输出;

如果a()为假那么后面有输出。

or就是起一个条件判断的作用而已

===============================================================================================

下面是PHP面向对象精华

1 使用extends实现继承以及重载、魔术方法的含义

class B extends A

声明的时候B里可以没有A里的方法

调用的时候$b=new B();

$b->A里的方法();

$b->A里的属性=1;

$b->B里的方法();

$b->B里的方法();

如果$a=new A();

可以

$a->A里的方法();

$a->A里的属性=1;

不可以

$a->B里的方法();

$a->B里的方法();

重载:B继承A,B里实现和A同名的方法属性。

PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。

魔术方法:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。

2 继承用private和protected访问修饰符可见性

属性方法private不可以被继承

属性方法protected类外部不可见,可以被继承

属性方法public 所定义的类成员可以在任何地方被访问

3php中双冒号::的应用

php类代码中常看到"::"的操作符,这个是作用域限定操作符,是用一个双冒号"::"表示,它用来置顶类中不同作用域的级别。左边是作用域右边是访问作用域的成员。

在php中定义的作用域有self和parent两种(在php6中提供了static作用域)。

范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员方法和常量,还可以用于子类覆盖父类中的成员和方法

classMyClass{
const
CONST_VALUE='Aconstantvalue';
}

echo
MyClass::CONST_VALUE;

classOtherClassextendsMyClass
{
publicstatic
$my_static='staticvar';

publicstaticfunction
doubleColon(){
echo
parent::CONST_VALUE."\n";
echo
self::$my_static."\n";
}
}

OtherClass::doubleColon();

//子类覆盖父类

classMyClass
{
protectedfunction
myFunc(){
echo
"MyClass::myFunc()\n";
}
}

class
OtherClassextendsMyClass
{
//覆盖父类中的方法
publicfunctionmyFunc()
{
//但仍然可以调用已被覆盖的方法
parent::myFunc();
echo
"OtherClass::myFunc()\n";
}
}

$class=newOtherClass();
$class->myFunc();

4 php中this和self以及parent的作用

this:就是指向当前对象实例的指针,不指向任何其他对象或类。

self:表示当前类的作用域,与this不同的是它不表示类的某个特定实例,在类之外的代码中不能使用self,而且它不能识别自己在继承中层次的位置。也就是说,当在扩展类中使用self时,它调用的不是父类的方法,而是扩展类的重载的方法。self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。

private static $firstCount = 0;
private $lastCount;

//构造函数
function __construct()
{
$this->lastCount = ++self:$firstCount; //使用self来调用静态变量,使用self调用必须使用::(域运算符号)
}

parent:表示当前类父类的作用域,其余的跟self特性一样。parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。

//继承类的构造函数
function __construct( $personSex, $personAge )
{
parent::__construct( "test" );//使用parent调用了父类的构造函数
$this->personSex = $personSex;
$this->personAge = $personAge;
}

5 构造函数与析构函数

具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

function__construct(){}
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

function__destruct(){}

6 final 关键字

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。

7 继承和构造函数

父类 子类 结果
有构造函数 无构造函数 父构造
有构造函数 有构造函数 子构造

8 接口

可以通过interface来定义一个接口,就像定义一个标准的类一样。

注意:

1)但其中定义所有的方法都是空的;

2)接口中定义的所有方法都必须是public,这是接口的特性;

3)实现多个接口时,接口中的方法不能有重名

4)接口也可以继承,通过使用extends操作符;

5)接口中也可以定义常量。接口常量和类常量的使用完全相同。 它们都是定值,不能被子类或子接口修改。

//声明一个'iTemplate'接口
interfaceiTemplate
{
publicfunction
setVariable($name,$var);
publicfunction
getHtml($template);
}

//实现接口
//下面的写法是正确的
classTemplateimplementsiTemplate
{
private
$vars=array();

publicfunction
setVariable($name,$var)
{
$this->vars[$name]=$var;
}

publicfunction
getHtml($template)
{
foreach(
$this->varsas$name=>$value){
$template=str_replace('{'.$name.'}',$value,$template);
}

return
$template;
}
}

9 属性
类的变量成员叫做“属性”,属性声明是由关键字public或者protected或者private开头,然后跟一个变量来组成。 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指php脚本在编译阶段时就为常数,而不是在编译阶段之后在运行阶段运算出的常数。

在PHP5 中,预定义了两个函数“__get()”和“__set()”来获
取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。

简单的说一个是取值,一个是赋值。,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加://__get()方法用来获取私有属性

  1. <?php
  2. classPerson{
  3. //下面是人的成员属性
  4. private$name;//人的名字
  5. private$sex;//人的性别
  6. private$age;//人的年龄
  7. //__get()方法用来获取私有属性
  8. privatefunction__get($property_name){
  9. if(isset($this->$property_name)){
  10. return($this->$property_name);}else{
  11. return(NULL);
  12. }
  13. }
  14. }
  15. //__set()方法用来设置私有属性
  16. privatefunction__set($property_name,$value){
  17. $this->$property_name=$value;
  18. }
  19. //__isset()方法
  20. privatefunction__isset($nm){
  21. echo"isset()函数测定私有成员时,自动调用<br>";
  22. returnisset($this->$nm);
  23. }
  24. //__unset()方法
  25. privatefunction__unset($nm){
  26. echo"当在类外部使用unset()函数来删除私有成员时自动调用的<br>";
  27. unset($this->$nm);
  28. }
  29. }
  30. $p1=newPerson();
  31. $p1->name="thisisapersonname";
  32. //在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
  33. echovar_dump(isset($p1->name))."<br>";
  34. echo$p1->name."<br>";
  35. //在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
  36. unset($p1->name);
  37. //已经被删除了,所这行不会有输出
  38. echo$p1->name;
  39. ?>


10 克隆

对象复制可以通过clone关键字来完成(如果对象中存在__clone()方法,会先被调用)。对象中的 __clone()方法不能直接调用。

当对象被复制后,PHP5会对对象的所有属性执行一个“浅复制”(shallow copy)。所有的属性中的引用 仍然不变,指向原来的变量。如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值(如果有必要的话)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics