1.静态变量(加 static)属于类,程序运行时,就分配空间,常用作常量,使用类就可以调用。
2. 实例变量 (不加 static)属于对象,在实例化(new) 时,分配空间。
3.局部变量(在函数内的变量)属于某个代码块(函数),在调用调用这个函数时,分配空间。
4
//后期静态绑定
class A {
public static function who(){
echo "A类的who方法";
}
public static function test(){
// self::who(); //A类的who方法(self代表类本身)
static::who(); //b类的who方法(static根据上下文查找)
}
}
class B extends A{
public static function who(){
echo "b类的who方法";
}
}
B::test();
5.魔术方法
//魔术方法
class Test{
private $abc = '';
public function __set($var,$val){//当对象设置一个不存在属性,或者属性权限不够时调用此方法
echo $var.'set';
}
public function __get($var){//当对象使用一个不存在属性,或者属性权限不够时调用此方法
echo $var.'get';
}
public function __isset($name)//当isset()或者empty()一个不存在或者权限不够的属性时调用此方法
{
echo $name.'isset';
}
public function __unset($name)//当销毁一个不存在或者权限不够的属性时调用此方法
{
echo $name.'unset';
}
public function __call($name, $arguments)//当调用一个不存在(权限不够,第一个参数是方法名,第二个参数是方法参数)的方法时调用
{
echo $name.'<br>';
print_r($arguments);
}
public static function __callStatic($name,$arguments){//魔术方法也是静态的 当调用一个不存在(权限不够,第一个参数是方法名,第二个参数是方法参数)的静态方法时调用
echo $name.'<br>';
print_r($arguments);
}
public function __invoke($arg)//把对象当函数使用时调用这个方法
{
print_r($arg);
}
public function __toString()//echo对象时调用此方法,方法内必须return
{
return 'toString';
}
}
$test = new Test();
//$test->abc = 'cehsi';
//empty($test->abc);
//unset($test->abc);
//$test->go(1,'ceshi');
//$test::gogo(2,'ceshi');
//$test('对象当函数使用');
echo $test;
6.对象拷贝
6.1 浅拷贝,通过地址指向同一个值,一个变量改变值时另一个变量值也改变。
6.2 深拷贝,复制出一个新的值,相互之间互不影响。
//变量之间的拷贝(浅拷贝,深拷贝)
class A{
public $age = 0;
}
$a = new A;
//$b = $a; //浅拷贝(省内存,php默认是浅拷贝)
$b = clone $a;//使用clone则是深拷贝
$b->age = 1;
print_r($a->age);
7.trait关键字(解决php是单继承,无法继承多个类的问题,是一种代码复用机制)
//trait关键字
trait A{
public $name = 'hong';
public function testa(){
echo 'hello';
}
public function testb(){
echo 'world';
}
}
trait C{
public function testc(){
echo 'ccc';
}
}
class B{
use A;
use C;
}
$b = new B;
$b -> testa();
$b -> testc();
print_r($b->name);
8.接口类
//接口类(可以理解接口是类的模板,接口可以继承不能实例化)
interface Person{
public function eat();
public function sleep();
}
class Man implements Person{
public function eat(){
echo '大口吃';
}
public function sleep(){
echo '睡觉打呼噜';
}
}
class Woman implements Person{
public function eat(){
echo '小口吃';
}
public function sleep(){
echo '睡觉很安静';
}
}
$user = new woman;
$user ->eat();
$user ->sleep();
9.抽象类
//抽象类(介于接口和类之间的)
abstract class Person{
public function eat(){
echo '必须吃';
}
//抽象方法
abstract public function sleep();
}
class Man extends Person{
// public function eat(){
// echo '大口吃';
// }
//继承抽象类的子类需要实现抽象类中定义的抽象方法
public function sleep(){
echo '睡觉打呼噜';
}
}
$user = new Man;
$user ->eat();
$user ->sleep();
10.设计模式
10.1单例模式
//单例模式(只能被实例化一次,节省内存)
class Test{
private static $_instance = null; //唯一实例存储在静态变量中
private function __construct()//私有的构造方法禁止被实例化
{
}
private function __clone()//私有的克隆方法禁止被克隆
{
}
public static function getInstance()
{
// if (!self::$_instance instanceof self) {//判断静态变量是否是是否存储类
// self::$_instance = new self();
// }
if (self::$_instance == null) {//判断静态变量是否是是否存储类
self::$_instance = new self();
}
return self::$_instance;
}
public function test(){
echo '这是一个单例模式';
}
}
//
//
$t = Test::getInstance();
$t->test();
10.2工厂模式
//工厂模式
class Memach{
public function set($k,$v){
}
public function get($k){
echo 'Memach';
}
public function delete($k){
}
}
class Redis{
public function set($k,$v){
}
public function get($k){
echo 'Redis';
}
public function delete($k){
}
}
class Cache{
public static function factory(){//这个方法这是返回一个缓存实例
return new Redis;//如果想更换缓存,只修改此处代码就可以
}
}
$cache = Cache::factory();
$cache ->get(3);