欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP接口、抽象类以及一个验证码登录小案例

程序员文章站 2023-12-24 11:40:33
...

PHP interface:接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。

接口的声明

接口中所有的方法都是抽象方法,而且不需要在方法前使用 abstract 关键字进行修饰。而且在接口中也不需要显示地使用 public 访问权限来进行修饰,因为默认权限就是 public 的,也只能是 public(公有的)。另外,接口中不能声明变量,只能使用 const 关键字声明为常量类型的成员属性。
  1. interface Demo
  2. {
  3. const NAME = 'PHP中文网';
  4. const URL = 'www.php.net';
  5. function fun1();
  6. function fun2();
  7. }
  8. echo Demo::NAME . '<br>';
  9. echo Demo::URL . '<br>';

输出如下:

PHP中文网
www.php.cn

接口的应用

在使用 implements 关键字继承接口的同时,还可以使用 extends 关键字来继承一个类。也就是说,可以在继承一个类的同时实现多个接口,但一定要先使用 extends 继承类再去使用 implements 实现多个接口。语法格式如下:

class 类名 extends 父类名 implements 接口一, 接口二, …, 接口 n {
// 实现所有接口中的抽象方法
}

  1. <?php
  2. //interface:接口
  3. interface Demo
  4. {
  5. const NAME = 'PHP中文网';
  6. const URL = 'www.php.cn';
  7. function fun1();
  8. function fun2();
  9. }
  10. echo Demo::NAME . '<br>';
  11. echo Demo::URL . '<br>';
  12. class Website implements Demo
  13. {
  14. public function fun1()
  15. {
  16. echo self::NAME . '<br>';
  17. }
  18. public function fun2()
  19. {
  20. echo self::URL . '<br>';
  21. }
  22. }
  23. $obj = new Website();
  24. $obj->fun1();
  25. $obj->fun2();

结果如下:

PHP中文网
www.php.cn
PHP中文网
www.php.cn

我们还可以使用 extends 关键字让一个接口去继承另一个接口,实现接口之间的扩展。

  1. interface One
  2. {
  3. const NAME = 'PHP中文网';
  4. const URL = 'www.php.cn';
  5. function fun1();
  6. function fun2();
  7. }
  8. interface Two extends One{
  9. function fun3();
  10. function fun4();
  11. }
  12. class Site implements Two{
  13. function fun1(){}
  14. function fun2(){}
  15. function fun3(){
  16. echo self::NAME . '-----使用继承的接口的方法' . '<br>';
  17. }
  18. function fun4(){}
  19. }
  20. $objsite = new Site();
  21. $objsite->fun3(); //PHP中文网-----使用继承的接口的方法

PHP abstract:抽象类和抽象方法

抽象方法

抽象方法是没有方法体的方法,所谓的没有方法体指的就是,在声明方法时候没有花括号{ }以及其中的内容,而是直接在方法名后加上分号结束。另外,在声明抽象方法时要使用“abstract”关键字修饰。格式如下所示:

abstract 访问权限修饰符 function 方法名1(参数列表);
abstract 访问权限修饰符 function 方法名2(参数列表);

抽象类

只要一个类里面有一个方法是抽象方法,那么这个类就必须定义为抽象类,抽象类也需要使用“abstract”关键字来修饰,抽象类中也可以包含不是抽象方法的成员方法和成员属性,但访问权限不能是私有的(使用 private 关键字修饰),因为抽象类中的方法需要被子类继承。

abstract class 类名{
public $name;
abstract 访问权限修饰符 function 方法名1();
abstract 访问权限修饰符 function 方法名2();
访问权限修饰符 function 方法名3(){
… … ;
}
}

抽象类就像是一个“半成品”的类,在抽象类中包含没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。

可以将抽象类看作是为它的子类定义公共接口,将它的操作(可能是部分也可能是全部)交给子类去实现。就是将抽象类作为子类重载的模板使用的,定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守。

当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也就不能实例化为对象。

定义一个抽象类,然后使用另一个类来继承这个抽象类并实现抽象类中的抽象方法。

  1. abstract class Website{
  2. public $name = 'PHP中文网<br>';
  3. public $url = 'php.cn<br>';
  4. abstract function title();
  5. abstract function output();
  6. }
  7. class Demo extends Website{
  8. public function title(){
  9. echo '这是抽象类和抽象方法<br>';
  10. }
  11. public function output(){
  12. echo $this -> name.$this -> url;
  13. }
  14. }
  15. $obj = new Demo();
  16. $obj -> output();
  17. $obj -> title();
  18. //PHP中文网
  19. //php.cn
  20. //这是抽象类和抽象方法

php composer 实例实现验证码登录

首先composer init一个项目。同时安装gregwar/captcha

创建index.php

  1. <?php
  2. require 'captcha.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7. <meta charset="UTF-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>验证码登录</title>
  11. </head>
  12. <body>
  13. <form action="validation.php" method="post">
  14. <input type="text" name="username" placeholder="请输入用户名">
  15. <br>
  16. <input name="userpwd" type="password" placeholder="请输入密码">
  17. <br>
  18. <img src="<?= $builder->inline() ?>" alt="">
  19. <br>
  20. <input type="text" name="authcode" placeholder="请输入验证码">
  21. <input type="submit">
  22. </form>
  23. <p><?= $_SESSION['phrase'] ?></p>
  24. </body>
  25. </html>

创建captcha.php

  1. <?php
  2. session_start();
  3. require __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
  4. use Gregwar\Captcha\CaptchaBuilder;
  5. $builder = new CaptchaBuilder;
  6. $builder->build();
  7. $_SESSION['phrase'] = $builder->getPhrase();
  8. $_SESSION['userpwd'] = 123456;//此处为了方便,就直接定义一个密码

创建validation.php

  1. <?php
  2. session_start();
  3. $_SESSION['username'] = $_POST['username'];
  4. header("Content-Type:text/html;charset=utf-8");
  5. if ((strcasecmp($_POST['authcode'], $_SESSION['phrase'])) == 0 && $_POST['userpwd'] == $_SESSION['userpwd']) {
  6. header("location:test.php");
  7. } else {
  8. header("location:false.php");
  9. }

创建登陆成功跳转页面test.php

  1. <?php session_start();
  2. ?>
  3. <!DOCTYPE html>
  4. <html lang="en">
  5. <head>
  6. <meta charset="UTF-8">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  9. <title>Document</title>
  10. </head>
  11. <body>
  12. <h2>welcome:<?= $_SESSION['username'] ?></h2>
  13. <h2>你的密码:<?= $_SESSION['userpwd'] ?></h2>
  14. <h2>刚才的验证码:<?= $_SESSION['phrase'] ?></h2>
  15. </body>
  16. </html>

PHP接口、抽象类以及一个验证码登录小案例

上一篇:

下一篇: