<?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.继承抽象类后,定义的抽象类方法访问权限不能小于抽象类中的设置。
*/
以上就是本次分享内容,如果有什么错误的位置希望发表评论给我个提醒,为了改变世界,我们在编程的路上不断前行。尴尬的事就是,第一次发莫名代码丢了,莫名尴尬。