php面向对象(二)
2015-11-01 20:07
701 查看
php面向对象(二)
phpzp2015-10-31
15:59-07
克隆对象
php的对象是引用类型,变量名往往指代的是一个指针,这点与js很相似,直接将
$spot对象赋值给
$al对象,这俩个对象指向的内存中的同一个对象,所以改变一个另外一个也会受到影响,但是php4中却不是这样的。
class Dog{
public $name;
function __construct($name) {
$this->name = $name;
}
}
$sopt = new Dog("haha");
$al = $sopt;
$al->name = "wangwang";
echo $sopt->name; // wangwang
[/code]
在php4中
$spot中的成员变量并不会被改变,php5中的这样非常像js。php中有一个
clone关键字,这个关键字可以为对象新开辟内存,使之成为俩个不同的对象。
class Dog{
public $name;
function __construct($name) {
$this->name = $name;
}
}
$sopt = new Dog("haha");
$al = clone $sopt;
$al->name = "wangwang";
echo $sopt->name; // haha
[/code]
比较对象
interface IAnimal{};
class Dog implements IAnimal{
public $name;
function __construct($name) {
$this->name = $name;
}
}
$sopt = new Dog("haha");
$al = clone $sopt;
// 对象比较
// "=="号表示对象值相等,"==="表示对象值相等,地址也相等这点与js非常不同啊,js中的俩个不同对象永远不可以相等啊,因为地址不同啊
var_dump($al == $sopt); // true
var_dump($al === $sopt); // false
// php不能echo出来bool值啊
// 对象检测 instanceof,这个和js的作用是一样的
// intanceof可以检测当前对象是属于哪个类
var_dump($al instanceof Dog); // true
var_dump($al instanceof IAnimal); // true
[/code]
魔术方法
__clone()在调用clone时会调用的方法
class Dog {
public $name;
function __construct($name) {
$this->name = $name;
}
function __clone() {
echo "被克隆啦";
}
}
$dog = new Dog("haha");
$al = clone $dog;
[/code]
__set()写入不存在或者不可见得成员变量时,php会执行
__set()方法俩个参数,变量名称和变量值;
__get()在读取不存在或者不可见得成员变量时,php会执行
__get(),
__get()有一个参数,参数就是需要读取的变量名;
class Student {
private $name;
public $job = "student";
function __construct($name) {
$this->name = $name;
}
public function __set($age,$value) {
$this->age = $value;
}
public function __get($type) {
echo "__get()被调用了";
return $this->$type;
}
}
$stu = new Student("zp");
$stu->age = 19;
echo $stu->name;
echo $stu->age;
echo $stu->job; // 调用可见的public成员变量时,并不会调用__get
[/code]
__call()方法,调用不存在或者不可见得成员方法时,php会先调用,
__call()方法来存储方法名及其参数,__call()方法有俩个参数,即为方法么和方法参数,方法参数以数组存在
class Student {
private $name;
function __construct($name) {
$this->name = $name;
}
private function getName ($name) {
return $this->name.$name;
}
public function __call ($foo,$arg) {
echo "__call()被调用了";
var_dump($arg);
}
}
$stu = new Student("zp");
echo $stu->getName('haha');
[/code]
__toString()方法,
echo对象时将调用这个方法,并且这个方法必须,返回一个字符串
class Student {
private $name;
function __construct($name) {
$this->name = $name;
}
public function __toString () {
echo "__toString()被调用了";
return $this->name;
}
}
$stu = new Student('zp');
echo $stu;
[/code]
__sleep在对象序列化时会调用,
__wakeup在对象反序列化时会调用
class Student{
public $name;
public $age;
function __construct($name,$age) {
$this->name = $name;
$this->age = $age;
}
public function __sleep() {
echo "在序列化时会调用";
}
public function __wakeup() {
echo "在反序列化时会调用";
}
}
$obj = new Student('zp',19);
var_dump(serialize($obj));
var_dump(unserialize($obj));
[/code]
__autoload可以调用自动实例化需要使用的类
我在同一目录下,建立了一个文件,这个文件内就是一个Test类,文件名为Test.class.php
class Test{
private $cont;
public function __construct($cont) {
$this->cont = $cont;
}
public function __toString() {
return $this->cont;
}
}
[/code]
在另外一个php中利用
__autoload来自动实例化需要的test类
function __autoload($class_name) {
$class_path = $class_name.'.class.php';
if (file_exists($class_path)) {
include_once($class_path);
} else {
echo "类路径错误";
}
}
$test = new Test("这是一个测试啊");
echo $test;
[/code]
相关文章推荐
- php面向对象(一)
- PHP实现QQ快速登录
- laravel中ubuntu下执行php artisan migrate总是报错
- php实战之使用递归读取商品无限分类
- vsftpd说明,有用,转了
- PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
- 重读php文档
- ThinkPHP学习实践(二)单字母函数用法
- DATASNAP中间件调用带OUTPUT参数的存储过程
- 关于php的register_globals和magic_quotes_gpc参数配置
- OS X 10.11下PHPstorm php-cgi not found 并且访问项目目录502
- phpstrom+xdebug 配置
- 关于php-echo原理
- sae中配置weiphp,修复图片上传问题
- PHP命名空间解析规则
- 对于zendframework2的路由配置的说明
- API 参考 (SQL Server Driver for PHP)
- php输出查询数据转换成json
- 如何修改WAMP中mysql默认空密码&重新登录phpmyadmin
- PHP+Mysql+AJAX登录验证