PHP 抽象类的简单测试与总结

本文探讨了PHP抽象类的概念,通过实例进行了测试,并对相关内容进行了总结。在编程的道路上,作者鼓励大家勇于发现错误,共同进步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
abstract class AbstractClass{
	//	定义必须设定的方法
	abstract protected function getValue();
	abstract protected function prefixValue($prefix);
	
	//	普通方法的定义
	public function printOut(){
		print $this -> getValue().'\n';
	}
	
	public function starice(){
		echo "starice\n";
	}
}
//Strict standards: Non-static method AbstractClass::starice() should not be called statically in D:\wamp64\www\Ces\ClassCes.php on line 17
//	非静态的方法调用,能出现结果,但是会报错
// AbstractClass::starice();

class CLASS1 extends AbstractClass{
	//	继承抽象类的子方法
	public function getValue(){
		return "ClassCes true";
	}
	//	Fatal error: Class CLASS1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::prefixValue) in D:\wamp64\www\Ces\ClassCes.php on line 19
	//	必须实现抽象类的所有抽象方法
	
	protected function prefixValue($prefix){
		$str = '接收成功'.$prefix;
		return $str;
	}
	// Fatal error: Access level to CLASS1::prefixValue() must be protected (as in class AbstractClass) or weaker in D:\wamp64\www\Ces\ClassCes.php on line 26
	//	实现抽象类的属性或方法,访问权限不能低于父类,不然将会发生语法错误。
}
//	Fatal error: Cannot instantiate abstract class AbstractClass in D:\wamp64\www\Ces\ClassCes.php on line 30
//	抽象类不能进行实例化。
//$obj = new AbstractClass();

abstract class Foo{
	static function bar(){
		echo "test\n";
	}
}

Foo::bar();

$obj = new CLASS1();
echo $obj -> getValue();

//	------	测试,定义一个抽象类
abstract class ClassCes1{
	abstract public function index();
	//Fatal error: Abstract function ClassCes1::index() cannot contain body in D:\wamp64\www\Ces\ClassCes.php on line 54
	//	抽象类不能有具体操作
}
//	抽象类实例化失败
//$obj = new ClassCes1();

class ClassCes2 extends ClassCes1{
	public function index1(){
		return 'Hello,World!';
	}
	//Fatal error: Class ClassCes2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (ClassCes1::index) in D:\wamp64\www\Ces\ClassCes.php on line 63
	//	没定义抽象方法
	public function index(){
		echo 'Hello , world!';
	}
}

$obj = new ClassCes2();
$obj -> index();
$ret = $obj -> index1();
var_dump($ret);


//			----------------------------------------------------	阶
//			----------------------------------------------------	段
//			----------------------------------------------------	2
//			----------------------------------------------------	|
//			----------------------------------------------------	|
//			----------------------------------------------------	|

abstract class ClassCes3{
	abstract protected function prefixName($name);
}

class ClassCes4 extends ClassCes3{
	// Fatal error: Declaration of ClassCes4::prefixName() must be compatible with ClassCes3::prefixName($name) in D:\wamp64\www\Ces\ClassCes.php on line 91
	//	定义抽象类方法参数以为的参数必须设有默认值,并且对应的位置不能放置不同定义的参数(空参数或默认参数)
	public function prefixName($name,$age='18'){
		
	}
}

//	抽象类中可以没有抽象方法,但是,具有抽象方法的类只能是抽象类。
abstract class A{
	public function show(){
		echo 'A';
	}
}

class C extends B{
	public function world(){
		echo 'C';
		parent::hello();
	}
}

class B extends A{
	public function hello(){
		echo 'B';
		parent::show();
	}
}

$obj = new B;
$obj -> hello();

//	普通类的继承就和函数调用一样,没有顺序,那抽象类呢?
$obj = new C;
$obj -> world();

abstract class horse extends A{
	public function get_bred(){
		return "Jersey";
	}
}

class cart extends horse{
	public function get_breed(){
		return "wood";
	}
}

$obj = new cart();
$return = $obj -> get_breed();
var_dump($return);
$return = $obj -> get_bred();
var_dump($return);

//	抽象类顺序放下去也没有影响,模仿测试失败!

class cart1 extends horse1{
	public function get_breed(){
		return "wood";
	}
}

abstract class horse1 extends A{
	public function get_bred(){
		return "Jersey";
	}
}
$obj = new cart1();
$return = $obj -> get_breed();
var_dump($return);
$return = $obj -> get_bred();
var_dump($return);


//	抽象类顺序再测试
class F extends D{
	public function get_breed(){
		echo "wood";
		parent::get_bred();
	}
}

abstract class D extends A{
	public function get_bred(){
		echo 'JERSEY';
	}
}

$obj = new F;
$obj -> get_breed();
//	类的定义先后顺序无关

abstract class FOO1{
	abstract public function dump();
}
//	Strict standards: Static function FOO::dump() should not be abstract in D:\wamp64\www\Ces\ClassCes.php on line 180
//	定义静态方法出现报错
class BAR extends FOO1{
	public function dump($i=1){
		var_dump("BAR");
		$c += $i;
		var_dump($c);
	}
}

abstract class class11{
	abstract public function someFunc();
}

// abstract class class12 extends class11{
	// abstract public function someFunc();
// }

//Fatal error: Can't inherit abstract function class11::someFunc() (previously declared abstract in class12) in D:\wamp64\www\Ces\ClassCes.php on line 198
//	抽象类继承抽象类过程中,不能重定义以被定义的抽象类方法
abstract class class12 extends class11{
	public function someFunc(){
		
	}
}

class class13 extends class12{
	public function someFunc(){
		
	}
	public function ces(){
		var_dump('true');
	}
}

//	----------------------------------------------------------	总
//	----------------------------------------------------------	结
//	----------------------------------------------------------	前
//	----------------------------------------------------------	测
//	----------------------------------------------------------	试
//	----------------------------------------------------------	|
//	----------------------------------------------------------	|
//	----------------------------------------------------------	|

abstract class ClassA1{
	public $name;
	abstract public function get_bred($name="zhang");
}

class ClassA2{
	public function get_bred($age="18"){
		var_dump($age);
	}
}
//	只要对应位置参数设置形式相同即可,无需参数名相同,默认值相同
$obj = new ClassA2;
$obj -> get_bred();

//	总结
/**
*		抽象类的定义 abstract(抽象)	抽象类中可以不定义抽象方法,但定义了抽象方法的只能是抽象类
		抽象类特性:1.抽象类继承抽象类不允许重定义抽象类方法
					2.抽象类不允许定义静态方法
					3.类的时候类似函数调用,不论创建顺序 (一般编写代码都是上到下)
					4.抽象类定义的抽象方法不允许有具体操作。
					5.继承抽象类设置抽象方法具体操作时,对应参数的设置不能改变(是否设置默认值的设置),如果要增加新的参数,新的参数必须设有默认值!
					6.继承抽象类后必须将抽象类设置的抽象方法全部设置!
					7.继承抽象类后,定义的抽象类方法访问权限不能小于抽象类中的设置。
*/


以上就是本次分享内容,如果有什么错误的位置希望发表评论给我个提醒,为了改变世界,我们在编程的路上不断前行。尴尬的事就是,第一次发莫名代码丢了,莫名尴尬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值