PHP精华

“<td>”.$a."</td>" = “<td>{$a}</td>" 

配置

php.ini

//ini_set("display_errors","On"); //显示所有错误信息*/
 ini_set("display_errors","Off"); //屏蔽所有错误信息 
通常服务器配置文件中,是屏蔽notice错误,只显示error错误,如果是这样的话,你打开错误显示,也不会显示notice错误
error_reporting() 设置 PHP 的报错级别并返回当前级别。

//禁用错误报告
error_reporting(0);

//报告运行时错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);

//报告所有错误
error_reporting(E_ALL);

output_buffering

默认是4096

;output_buffering = 4096
output_buffering = Off

这样出现echo在header之前就会报错“Warning: Cannot modify header information - headers already sent by (output started at xxx.php

所以php开启缓冲2种方法:

1.页面ob_start()

2.或者php.ini修改配置

--------------------------------------

output缓存--->程序缓存(不能控制)->输出->IE缓存(256字节)

Output Control 函数

  • flush — 刷新输出Apache的缓冲
  • ob_clean — 清空(擦掉)输出缓冲区
  • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
  • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_flush — 先输出PHP的ob缓冲区中的内容,再清空缓冲区。如果以后调用ob_get_contents只能得到flush之后进入缓冲区的内容
  • ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
  • ob_get_contents — 返回输出缓冲区的内容
  • ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
  • ob_get_length — 返回输出缓冲区内容的长度
  • ob_get_level — 返回输出缓冲机制的嵌套级别
  • ob_get_status — 得到所有输出缓冲区的状态
  • ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
  • ob_implicit_flush — 打开/关闭绝对刷送
  • ob_list_handlers — 列出所有使用中的输出处理程序。
  • ob_start — 打开输出控制缓冲   ob不缓存header
  • output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
  • output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
$contents=ob_get_contents();
file_put_contents("log.txt",$contents);

 深入理解ob_flush和flush的区别

http://www.laruence.com/2010/04/15/1414.html


-----------------------------------

文件操作

file_exists() 函数检查文件或目录是否存在

file_get_contents()得到文件

file_put_contents()生成文件

----------------------------------

正则表达式

preg_match

preg_match 匹配到一次就会停止,设置匹配到的一个匹配

preg_match_all  

preg_match_all() 返回的是所有匹配的数组

-----------------------------------

ping的通却不能远程解析URL试试wget

HTTP request sent, awaiting response... 403 Forbidden
10:58:22 ERROR 403: Forbidden.

 

 

break和continue

break 结束当前 for,foreach,while,do..while 或者 switch 结构的执行。
break 可以接受一个可选的数字参数来决定跳出几重循环。


continue 在循环结构用用来跳过本次循环中剩余的代码并开始执行本循环结构的下一次循环。
 注意在 PHP 中 switch 语句被认为是作为 continue 目的的循环结构。
continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。

输出1像素细的表格

if(!empty($datas)){
                echo "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\" bgcolor=\"#58CB64\"><tr><td width=\"100\" bgcolor=\"#FFFFFF\">id</td><td width=\"200\" bgcolor=\"#FFFFFF\">时间</td></tr>";
                foreach($events as $event){
                    echo "<tr><td  bgcolor=\"#FFFFFF\">".$datas['Id']."</td><td  bgcolor=\"#FFFFFF\">".$datas['inTime']."</td></tr>";
                }
                echo "</table>";
                }

 

 1.PHP和JS交互

<?php
$a=1;
?>
<script type="text/javascript">
var a=<?=$a?>;
alert(a);
</script>

拼凑HTML

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


2.PHP字符串技巧

<?php
$str = "Hello";
$number = 123;
$txt = sprintf("%s world. Day number %u",$str,$number);
echo $txt;
?>


输出:Hello world. Day number 123

 

单引号和双引号

单引号: ’a string’
不能内嵌变量, \’是唯一的转义码
双引号: ”a $better string\n”
可内嵌变量, 标准的转义码能正常使用
“Here-doc” 语法:
  $foo = <<<END
  …
  END;
对于多行的大文本或html非常有用
支持内嵌变量
注意:  以<<<END开头,后面另起新行
END; 占用一行,不能有空格

 

字符串连接小技巧

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

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

 

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

substr(string,start,length)

<?php
echo substr("Hello world!",6);
?>


输出:world!

 

strpos() 和strrpos()

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

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

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

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

 

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

<?php
echo strpos("Hello world!","wo");
?>

输出:6

 

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

 

<?php
$a=1;
echo <<<eot
<script language="JavaScript" type="text/JavaScript">
var a = $a;
alert(a);
</script>
eot;
?> 


addslashes() 函数

在指定的预定义字符前添加反斜杠。防sql注入

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。

$str = "Is \your name O'reilly?";
// 输出:Is \\your name O\'reilly?

echo addslashes($str);

 

使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。

$ip   = gethostbyname('www.baidu.com'); $long = ip2long($ip);

if ($long == -1 || $long === FALSE) {     echo 'Invalid IP, please try again'; } else {     echo $ip   . "</br>";           // 192.0.34.166     echo $long . "</br>";           // -1073732954     printf("%u</br>", ip2long($ip)); // 3221234342 } ?>

 
在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。
 
strcmp() 函数比较两个字符串。
0 - 如果两个字符串相等;<0 - 如果 string1 小于 string2;>0 - 如果 string1 大于 string2

 

htmlspecialchars() 把一些预定义的字符转换为 HTML 实体

 

intval

本函数可将变量转成整数类型。可省略的参数 base 是转换的基底,默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?> 


 

 

3.PHP数组技巧 

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

<html>
    <head>
        <title>测试</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
<?php
$a=array('aa','bb','cc');
$a[3]="dd";
for($i=0;$i<4;$i++)
{
   echo $a[$i]."</br>";
}

$b=array ('a'=>0,'b'=>1,'c'=>2);
echo $b['a']."</br>";
foreach($b as $key=>$value)
{
   echo $key."-".$value."</br>";
}

//each()函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动。
//返回的数组中包括的四个元素:键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
//如果内部指针越过了数组范围,本函数将返回 FALSE。

//注释:list()函数只用于数字索引的数组,且假定数字索引从 0 开始。
while(list($c1,$c2,$c3)=each($a))
{
    echo "$c1-$c2-$c3</br>";
}
?> 
</body></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

<?php
    echo "<br />\n";
$arr = array("one", "two", "three");


foreach ($arr as $i => $g) {
    echo "Key: $i; Value: $g<br />\n";
}
?>
 
reset() 函数

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

<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");

echo current($people) . "<br />";
echo next($people) . "<br />";
echo reset($people);
?>


 

输出:
Peter
Joe
Peter

 

array_fill ()函数

用给定的值填充数组

 

<?php
$a = array_fill(5, 6, 'banana');
print_r($a);
?>


输出:

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

 

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

$data = array(
'firstname'=>'Tom',
'lastname'=>'Smith',
'age'=>40
);

print_r($data);
echo json_encode($data);

输出:

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

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

 

说明:print_r($data,true);这样才可以把数组写到日志

$a =  array ("a", "b", "c");
$c= print_r($a,true);

$logfile  = "t.txt";

error_log("{$c}\r\n\r\n",3,$logfile);

 

<?php
$hello = array('1','2','3');
$helloJson = json_encode($hello);
echo $helloJson;
?>


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

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

 

implode() 函数

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

 

<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr);
?>


输出:

Hello World! Beautiful Day!

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

 

var_dump()

$a =  array ("a", "b", "c");
var_dump ($a);
echo "<br>";
print_r($a);
echo "<br>";

输出:

array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
Array ( [0] => a [1] => b [2] => c )


 

5.判断是否数组

if(is_array($ac))

 

6.类与引用

class common
{
  public $Name = 3;
  public function show()
	{
        echo ($this->Name);
        }
}
$am=new common();
$am->show();


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

 

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

class common
{
    public function show()
	{
        static $ap=1;
        $ap*=2;
        echo $ap;
        }
}

$am=new common();
$am->show();
$am->show();

输出:2   4


 

8.函数中的静态成员

class common
{
    public static $ap=1;
  public function show()
	{
               
        self::$ap*=2;
        echo self::$ap;
        }
}

$am=new common();
$am->show();

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

class MyObject  
{  
    public static $myVar = 0;  
      
    function myMethod()  
    {  
        self::$myVar+=2;  
        echo self::$myVar . "/n";  
    }  
}  
  
class MyOtherObject extends MyObject  
{  
    function myMethod()  
    {  
        echo "基类myMethod被重写";  
    }  
      
      
    function myOtherMethod()  
    {  
        echo "myExtendsedMethod" . "/n";  
        self::myMethod(); //在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法.   
        parent::myMethod();//如果基类的方法被重写的情况下,你希望调用定义在基类的方法,可以使用parent作用域.   
        parent::myMethod();//静态成员   
    }  
}  
  
MyOtherObject::myOtherMethod();  

 

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]");

 

php拆分日期时间,因为日期的长度是固定的,所以可直接用substr来做

echo substr(date("Y-m-d H:i:s"),0,10);//日期

echo substr(date("Y-m-d H:i:s"),10);//时间

unix时间戳和当前时差几天

select datediff(now(),FROM_UNIXTIME(1328803108))

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() 函数输出一条消息,并退出当前脚本。

include("view.php");die("打不开文件view.php");
$site = "http://4www.444.com.cn/";  
fopen($site,"r")  or die("Unable to connect to $site");  

输出:

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 所定义的类成员可以在任何地方被访问

 

3 php中双冒号::的应用

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

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

 

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

class MyClass {
    const 
CONST_VALUE 'A constant value';
}

echo 
MyClass::CONST_VALUE;

class OtherClass extends MyClass
{
    public static 
$my_static 'static var';

    public static function 
doubleColon() {
        echo 
parent::CONST_VALUE "\n";
        echo 
self::$my_static "\n";
    }
}

OtherClass::doubleColon();

//子类覆盖父类

class MyClass
{
    protected function 
myFunc() {
        echo 
"MyClass::myFunc()\n";
    }
}

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

$class = new OtherClass();
$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'接口
interface iTemplate
{
    public function 
setVariable($name$var);
    public function 
getHtml($template);
}

// 实现接口
// 下面的写法是正确的
class Template implements iTemplate
{
    private 
$vars = array();
  
    public function 
setVariable($name$var)
    {
        
$this->vars[$name] = $var;
    }
  
    public function 
getHtml($template)
    {
        foreach(
$this->vars as $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. class Person{   
  3. //下面是人的成员属性    
  4. private $name//人的名字   
  5. private $sex//人的性别   
  6. private $age//人的年龄   
  7. //__get()方法用来获取私有属性    
  8. private function __get($property_name){   
  9. if(isset($this->$property_name)){   
  10. return($this->$property_name);}else {   
  11. return(NULL);   
  12. }   
  13. }   
  14. }   
  15. //__set()方法用来设置私有属性    
  16. private function __set($property_name$value){   
  17. $this->$property_name = $value;   
  18. }   
  19. //__isset()方法    
  20. private function __isset($nm){   
  21. echo "isset()函数测定私有成员时,自动调用<br>";   
  22. return isset($this->$nm);   
  23. }   
  24. //__unset()方法    
  25. private function __unset($nm){   
  26. echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>";   
  27. unset($this->$nm);   
  28. }   
  29. }   
  30. $p1=new Person();   
  31. $p1->name="this is a person name";   
  32. //在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true   
  33. echo var_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()方法会被调用, 可用于修改属性的值(如果有必要的话)。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/21aspnet/article/details/6873989
个人分类: PHP基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭