2.6. PHP Classes 类与对象

简介:

2.6.1. 构造函数和析构函数 __construct() / __destruct()

		
<?php
class MyClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyClass();
?>
		
		
		
class Members extends Common{

	public function __construct() {
		parent::__construct();
	}
}
		
		

2.6.2. Traits

http://php.net/manual/en/language.oop5.traits.php

		
<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>


<?php
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
		
		

Multiple Traits

		
<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
		
		

Conflict Resolution

		
<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
?>
		
		

Changing Method Visibility

		
<?php
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

// Change visibility of sayHello
class MyClass1 {
    use HelloWorld { sayHello as protected; }
}

// Alias method with changed visibility
// sayHello visibility not changed
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
?>
		
		

Traits Composed from Traits

		
<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World!';
    }
}

trait HelloWorld {
    use Hello, World;
}

class MyHelloWorld {
    use HelloWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>		
		
		

2.6.3. PHP

		
<?php
$user = new stdClass();
$user->id = '1';
$user->username = 'neo';

print_r($a);


$user = array();
$user = (object)$user;
$user->firstname = 'Neo';
$user->lastname = 'Chen';
$user->age = 30;
?>		
		
		

2.6.4. Example

2.6.4.1. Method

例 2.1. 动态增加方法

				
				
<?php
class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                if ($argument instanceOf Closure) {
                    $this->{$property} = $argument;
                } else {
                    $this->{$property} = $argument;
                }
            }
        }
    }

    public function __call($method, $arguments) {
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}

$person = new stdObject(array(
    "name" => "nick",
    "age" => 23,
    "friends" => array("frank", "sally", "aaron"),
    "sayHi" => function() {
        return "Hello there";
    }
));

$person->sayHi2 = function() {
    return "Hello there 2";
};

$person->test = function() {
    return "test";
};

var_dump($person->name, $person->test(), $person->sayHi2());
?>				
				
		





原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

目录
相关文章
|
1月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
19 0
|
6月前
|
SQL 安全 PHP
理解php对象注入
php对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识。
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
php案例:自己写个数组转换成对象 对象转换成数组的的功能出来吧
|
3月前
|
JSON PHP 数据格式
|
9月前
|
存储 JSON PHP
在 PHP 中从 URL 获取 JSON 对象
在 PHP 中从 URL 获取 JSON 对象
|
8月前
|
XML 移动开发 Shell
CTF中常用的php原生类总结
CTF中常用的php原生类总结
117 0
|
9月前
|
存储 安全 搜索推荐
php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)
php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)
452 0
|
9月前
|
安全 关系型数据库 MySQL
使用php解压缩ZipArchive类实现后台管理升级的解决方案
使用php解压缩ZipArchive类实现后台管理升级的解决方案
55 0
|
9月前
|
关系型数据库 MySQL 程序员
漏刻有时操作数据php类记录及筛选条件的写法
漏刻有时操作数据php类记录及筛选条件的写法
41 1
|
9月前
|
JSON PHP 数据格式
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
php清洗数据实战案例(2):根据键值进行二维数据的对象数组的排序
55 0