- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在PHP中的面向对象是通过定义类,来完成对象的示例化,而PHP的抽象类和接口类可以说是类的一种规范,通过定义这两种类来对类进行强制约束,虽然这两种都是对类的约束,但本质上他们还是有区别的。
抽象类的概念我们可以用动物的继承关系来说明问题,当我们写父类Animal类时,其中有两个方法sleep(),eat(),因为不知道具体是什么动物而无法确定方法中写什么内容。这是我们就可以用抽象类进行实现。
<?php
//通过关键字abstract来声明抽象类
abstract class Animal{
protected $name;
protected $age;
//声明该方法是抽象方法
abstract public function sleep();
abstract public function eat();
}
当父类的一些方法不能确定的时候,可以用abstract关键字来修饰该方法,称为抽象方法,而用abstract修饰的类称为抽象类。
基本语法:
abstract class 类名{
abstract 访问修饰符 函数名(参数列表);
}
在开发中当我们想让继承该类的所有子类都重写该类的方法,就可以用抽象方法来实现。抽象类就好比某个东西的架子也可以说是一个模板,有了模板就可以可以根据模板实现具体的功能。,而模板和具体事物的这种关系是通过继承类传递的。就好比一台电脑,通过模板来制作一台台电脑。而抽象类定义出来就是需要被继承的。
<?php
abstract class Animal{
protected $name;
protected $age;
abstract public function sleep();
abstract public function eat();
}
class Dog extends Animal{
}
......结果........
Fatal error: Class Dog contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Animal::sleep, Animal::eat) in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\chouxiang.php on line 13
当一个类继承了抽象类后,在子类中就需要实现父类的所有抽象方法上面报的错误就是说在父类中包含2个抽象方法,子类必须实现该抽象方法。而关于抽象类的特点可以总结如下:
<?php
abstract class Animal{
protected $name;
protected $age;
public function sleep(){
}
public function eat(){
}
}
<?php
abstract class Animal{
protected $name;
protected $age;
abstract public function sleep();
abstract public function eat();
public function cry(){
}
}
abstract public function eat();
没有{},也就是说没有方法体。
接口的初衷和抽象类是一样的,不知道方法里面怎么实现的时候可以用接口来实现。而接口的定义是:给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来,接口的出现体现了高内聚低耦合的特点。
<?php
interface iTechnical{
public function fly();
}
基本语法:
interface 接口名{
//方法, 在接口中,所有的方法都不能有方法体, 即都是抽象方法
}
接口类和抽象类大致一样,那接口具体是什么呢?上面有说到抽象类就好比一台笔记本的架子、模板,然后根据模板创建具体的笔记本,而没有笔记本都有几个usb接口,而接口类就好比这些笔记本上的接口,是一个扩展的实现。就像动物一样都继承了动物特有的特性吃,睡等,但是突然一只动物在别的地方实现了写字的本领,这种本领就是通过接口进行扩充的。
接口的命名一般是在类名的第一个字母是小写的i开头。在**接口类中所有的方法都默认是抽象方法。**所以并不需要写abstract来声明。
我们定义一个接口当然是让别的类去实现的,这里说的是实现,而不是继承,接口和别的类之间是实现的关系,也就是类实现了某一接口,用implements关键字实现。
interface iTechnical{
public function fly();
}
class Dog implements iTechnical{
public function fly(){
echo '<br>飞';
}
}
当然在子类中必须实现接口中所有的方法。
关于接口的特点有以下几点:
class Dog implements 接口1,接口2{
}
在PHP中继承是单继承的,也就是一个类最多只能有一个父类,这种单继承的机制可以保证类的纯洁性。但是这种机制对子类功能扩展有一定的影响。
接口的出现可以说是对继承的一种补充,继承是层级的,不太灵活,而接口却没有它比抽象要灵活的多。并且实现接口在不打破继承关系的前提下,对子类的功能进行扩充。
它们两个的关系图可以理解为这样:
在上面的介绍中每个类都是可以被继承的,如果我们有一个类,我们不想让子类去重写里面的某个方法,或者不想让别的类去继承该类,就可以用到关键字final。final中文意思:最后的,最终的,可以用来修饰类或者方法。
final可以修饰方法或者类,如果修饰方法,则表示该方法不可以被继承类去重写,如果final 修饰了一个类,则表示该类不可以被继承。
基本语法:
final class 类名{
}
class 类名{
final 访问修饰符 function 函数名(形参){}
}
修饰类和修饰方法。
<?php
final class A{
}
class B extends A{
}
.....结果.....
Class B may not inherit from final class (A)
不能继承用final修饰的类。
<?php
class A{
final public function sum($num1,$num2){
return $num1 + $num2;
}
}
class B extends A{
public function sum($num1,$num2){
return $num1 + $num2;
}
}
.....结果.....
Cannot override final method A::sum()
从结果中可以看出来不能重写用final定义的方法。
在使用final时,只能用来修饰类或者方法,不能修饰属性。当一个类被final修饰后,类中的方法就不需要被final修饰,因为类都不能继承了,方法就不能重写。同时final修饰的类是可以被实例化的。
如果一个方法被final修饰,是可以被继承的,但是不能被重写。
<?php
class A{
final public function sum($num1,$num2){
return $num1 + $num2;
}
}
class B extends A{
}
$b = new B();
echo $b -> sum(1,2);
.......结果.......
3
在我们写单例模式时,说过当时的单例模式是不完善的,可以通过继承来得到不同的对象,在这里我们使用final关键字修饰单例类,防止继承,这样就不能通过继承的到别的对象。
类常量和普通的常量是一个概念,当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const去修饰该成员变量,这样这个变量就自动成为常量。在类中的常量称为类常量。前面我们讲过定义常量有两种方式define()和关键字const,在类中必须使用const这种方式,使用define()是会报错的。
<?php
class A{
const PI = 3.1415926;
public function getPI(){
return A::PI;
}
}
$a = new A();
echo $a -> getPI();
echo '<br>';
echo A::PI;
......结果......
3.1415926
3.1415926
类常量的命名一般是全部用大写字母,中间用下划线隔开,同时常量前面没有$符号。常量必须在定义的时候就赋值。同时常量的前面不能有修饰符,默认是public。
常量的访问形式分为两种,一种是在类的内部进行访问,一种是在类的外部进行访问。
内部访问
通过 类名::常量名进行访问。
class A{
const PI = 3.1415926;
public function getPI(){
return A::PI;//通过类名进行访问
}
}
通过 self::常量名进行访问
class A{
const PI = 3.1415926;
public function getPI(){
return self::PI;//通过类名进行访问
}
}
可以通过self进行访问说明常量是属于类的,并不属于对象的。
外部访问
通过类名::常量名访问。
echo A::PI;
通过对象名::常量名访问
$a = new A();
echo $a::PI;
不过推荐使用第一种,通过类名进行访问。
如果一个类中有常量,则在继承的时候常量也是可以被继承的。同时常量的数据类型不能是对象。
PHP中抽象和接口应用让我们的更加清楚的把握需求的骨架,更好的搭建我们的代码体系。同时利用抽象和接口降低代码的耦合度。利于代码的扩展。
我对 java 中的抽象有点困惑。 我查了很多页面说抽象就是数据隐藏(隐藏实现)。 我对抽象的理解是它是“部分实现”。只需在抽象类/接口(interface)中定义您需要的内容,然后扩展/实现它们并添
我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。 我四处搜索,发现了一个名为
目录 Java基础知识(抽象) 抽象 抽象定义 abstract的使用 定义抽象类
这个月我花了一些时间与 Emacs Lisp 进行斗争,试图获得更好地满足我需求的自动缩进。令人惊讶的是,大多数缩进代码是多么低级。我只看到了很少的抽象,例如 搜索不在字符串或注释中的第一个正则表达式
我有以下内容: public abstract class Foo{ //contents of Foo // ... public class Bar extends
我有三个类(class)(A 类、B 类和 C 类)。 类 A 调用 B 的实例并运行 start()。 B类扩展了Thread,因此当调用start()时,run()方法中的任何内容都会被执行。 在
这个问题已经有答案了: Calling a subclass method from superclass (5 个回答) 已关闭 7 年前。 Klasse1是一个抽象类,有一个 foo()方法。 K
我有一个这样的函数: def test(): x = "3" # In actual code, this is computed if x is None: retu
我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors de
这是我第一次发帖,但我遇到了很多问题。我目前有一个带有标题的 AbstractDevice 类: public abstract class AbstractDevice> implements De
我有一个 MotorDefinition 类和一个名为 Motor 的抽象类: class MotorDefinition { public: MotorDefinition(int p1,
是否有任何方法可以在这种代码(sass)中制定 css 的抽象规则: #cottage-image-gallery input:nth-of-type(1):checked ~ label:nth-o
是否可以声明一个已知的基类型并允许传输所有派生类型? [ServiceContract] public interface IService { [OperationContract]
我目前正在为基于 Java 的文本游戏开发角色生成机制,但我遇到了一个问题,看不出哪里出了问题。我有一个“Character”类,它是抽象的,然后是另一个类“NPCharacter”,它是建立在这个之
抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在! 我正在寻找一个好的抽象来用于涉及并发线程的情况。 我已经接近了,但还不是很清楚。 稍微简化一下,我在 Android 手机上收集了两种传感器
提前感谢您阅读本文。我不完全理解如何/何时使用摘要,所以我试图在我从事的每个项目中考虑它,看看它是否会在某一天全部点击 Smile | :) 此外,可访问性级别(私有(private)、 protec
我正在探索用于生成 Web 内容的 XML -> XSLT -> HTML 模因。我的 XSLT 经验很少。 我很好奇 XSLT 中有哪些机制可用于处理抽象或“重构”。 例如,使用通用 HTML 和服
在这些谈话中 Nicholas Zakas和 Addy Osmani他们讨论了在构建大型 Javascript 应用程序时将外观模式用作沙箱的想法,以便将应用程序与底层基础库分离。 这种解耦理论上允许
我使用C++和CUDA/C,想为特定问题编写代码,但遇到了一个非常棘手的简化问题。 我在并行编程方面的经验不容忽视,但相当有限,我无法完全预见到此问题的特殊性。 我怀疑是否有一种方便甚至“轻松”的方式
假设我有: trait A class B extends A class C extends A 有没有办法配置类型参数: class Foo[AType <: A with canCreateIn
我是一名优秀的程序员,十分优秀!