对象是类的实例化
对象之间可以传递,接收并处理信息。
类拥有属性和方法 ,访问控制 public protect private
特殊方法之构造方法 __construct($parameter1,$parameter2,...),在实例化的时候 new Task($a,$b,...)
类的内部访问属性或者方法的时候,使用$this,它代表该类的实例
注意事项:
在类的内部定义两个public方法,来实现一些访问控制,或者读取、设置一些特殊的属性
封装:尽可能的隐蔽一些信息,不需要用户直到内部放生了什么,只需要知道可以有哪些操作就可以了。比如灯泡开关的问题,只知道开关就可以了,不需要知道线路什么的。具体实现关键字 private、protected。
protected主要用于继承。在外部不可以被调用。
private私有属性或者方法,不可以被外部访问,不可以被继承。
class A extends B {}
子类可以直接使用继承的属性和方法,实现代码的复用
子类重写父类的方法时,重新定义方法名即可
注意事项:
abstract class Shap {
public $color;
public function __construct($color){
$this->color = $color;
}
abstruct public function squire();
}
抽象类是用于继承的,不能被实例化
抽象类如果有抽象方法的时候,子类必须实现抽象方法
这样做可以保持类的一致性。
注意事项:
接口类似于契约,条款,劳动合同等。比如短信接入,支付通道接入,日志记录方式(文件记录,DB记录)等。这样做是为了方便切换,而不需要大幅度的修改代码。
interface Logger{
public function save();
}
class FileLogger implements Logger{
public function save(){
return 'save log by file';
}
}
class DatebaseLogger implements Logger{
public function save(){
return 'save log by datebase';
}
}
class UserController {
producted $logger;
public function __construct(FileLogger $logger){
$this->logger = $logger;
}
public function register(){
$name = 'Tom';
$this->logger->save();
}
}
$controller = new UserController( new FileLogger );
$controller->register();
注意事项:
PSR-4标准 namespace命名空间的出现是为了解决多个文件代码的冲突,类似于一个文件夹下文件名不能一样。
命名空间类似与文件夹系统,laravel中使用PSR-4标准 namespace 该文件所在的文件夹目录,相对于App。
项目当中最佳实践:一个类一个文件
自动加载使用composer工具,这个点的知识需要候补。composer自动加载。
注释:
静态方法和静态属性只与类有关,与实例化的对象无关。
static 定义的属性和方法是全局性的,相当于global。
在类的外部使用的时候,格式例如: ClassName::staticOption/staticMethod
在类的内部使用的时候,格式例如: self::staticOption/staticMethod
额外辅助:
function add(...$num){
return array_sum($num);
}
function add(){
return array_sum(func_get_args());
} 候补参数中...写法
class HttpStatusCode{
const HTTP_NOT_FOUND = 404;
public function getStatusCode(){
return self::HTTP_NOT_FOUND;
}
}
echo HttpStatusCode::HTTP_NOT_FOUND;
$obj = new HttpStatusCode();
echo $obj->getStatusCode();
一但使用关键字const定义了常量,不管是在类的外部或者类的内部,是无法改变它的值的。除非手动修改值。
应用场景一般是固定值,一旦确定就不可改变的,比如状态码。。。
应用场景:
trait OwnerTrait(){
public function owner(){
echo 'owner';
}
}
class Arcital(){
use OwnerTrait;
}
class Comment(){
use OwnerTrait;
}
(new Comment())->owner();
注意事项: