# 属性 方法
变量(也称为”属性”),函数(也称为”方法”),都是类的成员.
- 静态属性或者方法在类的内部调用 self::方法名/属性名(属性名不加$会报错)
- 静态属性或者方法在类的外部调用 类名::方法名/属性名(属性名不加$会报错)
- 非静态静态属性或者方法在类的内部调用 $this->方法名/属性名(这里的属性不能加$)
- 非静态静态属性或者方法在类的外部调用 先实例化 再 $this-> 方法名/属性名(这里的属性不能加$)
//markdown 转义字符 “\$” 原样输出
php类属性方法的调用
类的三大特性
封装
把成员方法和成员属性封装到类中,隐藏属性和方法实现的细节
- public
- default
- protected
- private
继承
可以使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类
- 子类最多只能继承一个父类,而父类可以有多个子类
- 如果要在子类里面使用父类的方法,可以用父类名::父类方法来表示或者用parent::父类方法来表示
- 私有private只能被自身的类访问
多态
在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
- php声明变量不需要给变量设定类型,一个变量可以指向不同的数据类型,所以php不具有像java那种清晰的多态
关键字
static 静态
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
- 不加static的方法要先创建对象才能在对象上使用
- 只有static方法可以直接用 类名::方法名() 调用
- 要覆盖的方法不能有static关键字
const 常量
常量的值一旦被定义后就不可在程序中更改。
- 只可以修饰成员属性,不可以修饰方法
- 调用的时候需要使用 类名::常量
const constant = "value";
final
如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
- 属性不能被定义为 final,只有类和方法才能被定义为 final。
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
第三周作业
<?php
interface CalInterface{
public function add($mun1,$num2);
public function sub($mun1,$num2);
public function mul($mun1,$num2);
public function div($mun1,$num2);
}
class Calculate implements CalInterface
{
public function add($num1,$num2){
echo "$num1 + $num2 = ".($num1+$num2).PHP_EOL;
}
public function sub($num1,$num2){
echo "$num1 - $num2 = ".($num1-$num2).PHP_EOL;
}
public function mul($num1,$num2){
echo "$num1 * $num2 = ".($num1*$num2).PHP_EOL;
}
public function div($num1,$num2){
echo "$num1 / $num2 = ".($num1/$num2).PHP_EOL;
}
}
$InPut = $_POST['InPut'];
$Cal = new Calculate();
if($pos=strpos($InPut,"+")) {
if( preg_match("/^\d*$/",substr($InPut, 0, $pos)) && preg_match("/^\d*$/",substr($InPut, $pos+1, strlen($InPut)-1)) ){
$num1=vsprintf("%d",substr($InPut, 0, $pos));
$num2=vsprintf("%d",substr($InPut, $pos+1, strlen($InPut)-1));
$Cal->add($num1,$num2);
}
else {
echo "Wrong InPut";
}
}
else if($pos=strpos($InPut,"-")) {
if( preg_match("/^\d*$/",substr($InPut, 0, $pos)) && preg_match("/^\d*$/",substr($InPut, $pos+1, strlen($InPut)-1)) ){
$num1=vsprintf("%d",substr($InPut, 0, $pos));
$num2=vsprintf("%d",substr($InPut, $pos+1, strlen($InPut)-1));
$Cal->sub($num1,$num2);
}
else {
echo "Wrong InPut";
}
}
else if($pos=strpos($InPut,"*")) {
if( preg_match("/^\d*$/",substr($InPut, 0, $pos)) && preg_match("/^\d*$/",substr($InPut, $pos+1, strlen($InPut)-1)) ){
$num1=vsprintf("%d",substr($InPut, 0, $pos));
$num2=vsprintf("%d",substr($InPut, $pos+1, strlen($InPut)-1));
$Cal->mul($num1,$num2);
}
else {
echo "Wrong InPut";
}
}
else if($pos=strpos($InPut,"/")) {
if( preg_match("/^\d*$/",substr($InPut, 0, $pos)) && preg_match("/^\d*$/",substr($InPut, $pos+1, strlen($InPut)-1)) ){
$num1=vsprintf("%d",substr($InPut, 0, $pos));
$num2=vsprintf("%d",substr($InPut, $pos+1, strlen($InPut)-1));
$Cal->div($num1,$num2);
}
else {
echo "Wrong InPut";
}
}
?>