- <?php
- //
- /**
- * Define MyClass
- */
- class MyClass
- {
- public $public = 'Public';
- protected $protected = 'Protected';
- private $private = 'Private';
- public function printHello()
- {
- echo $this->public;
- echo $this->protected;
- echo $this->private;
- }
- protected function pro_test(){
- var_dump(1);
- }
- }
- $obj = new MyClass();
- echo $obj->public; // 这行能被正常执行
- //echo $obj->protected; // 这行会产生一个致命错误
- //echo $obj->private; // 这行也会产生一个致命错误
- $obj->printHello(); // 输出 Public、Protected 和 Private
- $obj->pro_test();//直接报错
- ?>
- <?php
- function test(){
- $var=1;
- echo $var."</br>";
- $var++;
- }
- test();// 1
- test();// 1
- test();// 1
- ?>
如果我们给变量加上 static 那么就会变成这样
这里可能不能够体会到 PHP 这样做的好处,那么我们就先来假设一下读者也熟悉 JS,在 JS 中是没有 static 这个关键字的,所以如果我们要来实现一个具有能够保存每一次程序运算结果作为下一次运算的依据的一个程序我们需要这样来写。
- <?php
- function test(){
- static $var=1;
- echo $var."</br>";
- $var++;
- }
- test();// 1
- test();// 2
- test();// 3
- ?>
这样就会把 glo 泄漏到全局变量中,如果生成的变量比较多,就会导致内存泄露(内存泄漏所指代的就是变量占用过多的内存空间没有别释放)
- var glo = 0;
- function test() {
- glo++;
- document.writeln(glo);
- }
- test();
- test();
- test();
所以相比于在没有定义 static 的语言中,它具有一个优势是保持变量,不泄露内存,也不容易导致全局变量被误用(因为作用域不在全局)
- <script>
- var glo = 0;
- function test() {
- glo++;
- document.writeln(glo);
- }
- test(); // 1
- test(); // 2
- test(); // 3
- </script>
- $age = 0;
- $age++;
- function test1() {
- static $age = 100;
- $age++;
- echo $age."</br>";
- }
- function test2() {
- static $age = 1000;
- $age++;
- echo $age."</br>";
- }
- test1(); // 101
- test2(); // 1001
- class BaseClass {
- public $public = 'Public';
- function test() {
- echo "BaseClass::test() called\n";
- }
- final public function moreTesting() {
- echo "BaseClass::moreTesting() called\n";
- }
- }
- class ChildClass extends BaseClass {
- public function moreTesting() {
- echo "ChildClass::moreTesting() called\n";
- }
- }
- <?php
- interface testA{
- function funcA();
- }
- interface testB{
- function funcB();
- }
- interface testC extends testA {
- function funcC();
- }
- class run implements testC ,testB {
- public function funcA()
- {
- // TODO: Implement funcA() method.
- }
- public function funcB()
- {
- // TODO: Implement funcB() method.
- }
- public function funcC()
- {
- // TODO: Implement funcC() method.
- }
- }
- ?>
abstract 的作用跟 interface 其实是一样的,但是在 interface 中所有的方法都是必须要实现的,但是在 abstract 修饰的类中,可以有一个或者是多个的 abstract 修饰方法,所以我们可以这样理解,interface 就是 abstract 的一种特殊情况(当所有的方法都是抽象方法,都是必须要实现的)。abstract 有以下的这些特征:
1. 只要类中有至少一个方法使用了 abstract 关键字,那么这个类是 abstract,要加上相应的关键字 2. 抽象方法,只有方法的声明部分,没有方法体。但是在我看来,abstract 在实际的应用中有这样的几种场景 1. 多人编程的时候规范公共部分的命名规则(不做任何说明,原理跟 interface 一样)2. 实现不让父级直接实例化使用样式代码如下:
- <?php
- abstract class shopping
- {
- public function buy()
- {
- echo "buy";
- }
- public function loan()
- {
- echo "loan";
- }
- }
- class leslieBuy extends shopping
- {
- }
- //$test1=new shopping;//直接语法错误
- $leslieSie = new leslieBuy;
- $leslieSie->loan();//打印出loan
- ?>
来源: https://www.cnblogs.com/st-leslie/p/8098698.html