笔记php:php面向对象

笔记php:php面向对象

  1. public只能被实例访问
    protected 被父类和子类访问,不能直接被实例访问
    private 只能在本类内部访问
  2. 类内部 函数和属性 用 $this访问,外部用实例访问
    常量 类内部用self::const访问 外部用Class::const访问
  3. php面向对象中的final关键字
    可以用在类或函数前面,防止类被继承或函数在子类中被重写
  4. 命名空间(防止不同文件导入同一个文件时两个相同名字的类或函数冲突)
    先在其文件中用namespace定义,然后在其他文件中使用它中的类、函数、常量时
       use venter\a\ClassName;
       use venter\a\ClassName as AliasName;
       use function venter\myFunc;
       use const venter\MYCONST;
       namespace index;
       include '3.php';//全局命名空间(没有设置命名空间)  
       //当调用全局命名空间的类时类不能直接调用,要加\代表全局空间中查找
       var_dump(new \Test1());
       echo test2();//属性和常量则可以直接调用
       echo TEST3
    
    
4. 类自动加载
    function my_autoloader($class) {
        include 'classes/' . $class . '.class.php';
    }
    spl_autoload_register('my_autoloader');
    // 或者,自 PHP 5.3.0 起可以使用一个匿名函数
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });

在这里插入图片描述
根据类models\Imooc传入自动加载函数达到自动加载类文件的目的。

6. static关键字

变成类属性和方法
属性在这里插入图片描述
函数
在这里插入图片描述
在这里插入图片描述
上图会报错,静态方法不能调用非静态属性,静态方法调用静态属性,使用self关键词, t h i s 没 有 上 下 文 。 因 为 this没有上下文。因为 thisthis是类的实例,是对象。而加static的函数是类本身的函数,所以不能调用$a.
在这里插入图片描述
子类继承父类的带有static的函数时,可用parent::method();如下图:
在这里插入图片描述

7. 后期静态绑定

在这里插入图片描述
上图返回 “A类的who方法”
下图使用后期静态绑定,返回 “B类的静态方法”
在这里插入图片描述

8. 魔术方法

1). __set(),__get():

在这里插入图片描述
上图,类的实例改变类的私有属性,有魔术方法__set()实例才可以访问私有属性
2).__isset():
在这里插入图片描述
上图,当实例需要查询的属性未发现时会调用__isset()魔术方法,去类中寻找私有属性
3).__unset():
在这里插入图片描述
4).__call():
在这里插入图片描述
上图。当实例调用不存在的方法时,在类中定义魔术变量__call(),则此时不会报错,程序会执行魔术方法。
5).__callStatic():
在这里插入图片描述
上图,如果调用不存在的静态方法时,会调用该魔术方法,程序不会报错。

6).__invoke():
在这里插入图片描述
上图,当对象被当函数使用时,会调用__invoke()魔术方法

9. 对象拷贝和类型约束

1).浅拷贝(对象的赋值是浅拷贝,地址传递)(一个地址放一把钥匙,也可放其它东西)
在这里插入图片描述
2).深拷贝
$b = clone a ; ( a;( a;(a赋值了一份给$b)(两个值互不影响了)
在这里插入图片描述

上图,当对象a深拷贝给对象b时,但$a->obj = new B()还是浅拷贝,所以需要在在类A内部使用__clone()魔术变量,使obj深拷贝一份给自己。当b的obj改变时,a的obj不受影响.

类型约束
在这里插入图片描述

10. Trait(代码复用)
Trait A{
 //
}
Trait B{
 //
}
Trait C{
  Use A,B;
}

Calss Test{
  Use A,B;
  //Use C;
}

这样Test类中就拥有Trait类中全部的方法和属性了。

11. 接口(接口是类的模板,类是对象的模板,接口里的方法不定义,但接口里面的方法全部要在类中实现)

定义
在这里插入图片描述
接口可继承:
如下图,不过一般不这样做,而是直接class Test implements Ia,Ib{}
在这里插入图片描述
接口也可使用常量,如Ia中有const ABC=”abc”;则可以Ia::ABC;

12.抽象类(abstract)(抽象类中的方法在类中可部分实现,而且抽象类可以具体实现方法,接口只写方法名,不能具体实现,必须在类中全部实现)

要加class
在这里插入图片描述

13.单例模式和工厂模式

单例模式:实例化一个类多次,做到只开辟一个内存空间,节省内存空间
工厂模式:在多个位置实例化一个类,建另一个类来存它的实例并调用

单例模式:(本身类中定义方法)
在这里插入图片描述
在这里插入图片描述
工厂模式:(另外类中定义方法)
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_49888984/article/details/108023309