1. 本类的实例访问本类

1.1 本类实例访问本类的一非静态属性

  1. <?php
  2. class Father
  3. {
  4. public $a = 'a 属性';
  5. protected $b = 'b 属性';
  6. private $c = 'c 属性';
  7. }
  8. $fa = new Father();
  9. echo ($fa->a) . '<br>'; // a属性
  10. echo ($fa->b) . '<br>'; // 无法访问 受保护的属性
  11. echo ($fa->c) . '<br>'; // 无法访问 私有的的属性

我们轻易的就发现了一个问题,那就是类的实例只能访问类的公共方法。其实仔细一想这一点也很好理解啊。public 修饰的是一个公共的它是可以随意在类的外部被访问到的。_protected 受保护的:可以在当前类和当前类的子类中访问。可没有说的是类的外部。private就更不用说了,我们如果想要在类的外部访问 protected、private修饰的方法。我们通常这样做:在类的内部提供一个公有的方法_,我们通过这个公有的方法来获取。
如下面的代码:我们利用的是在类中,我们可以轻易的获取任何权限修饰的属性或者方法

  1. <?php
  2. class Father
  3. {
  4. public $a = 'a 属性';
  5. protected $b = 'b 属性';
  6. private $c = 'c 属性';
  7. public function getPropertyB()
  8. {
  9. return (new Father())->b;
  10. }
  11. public function getPropertyC()
  12. {
  13. return (new Father())->c;
  14. }
  15. }
  16. $fa = new Father();
  17. echo $fa->getPropertyB(); // b 属性
  18. echo $fa->getPropertyC(); // c 属性

1.2 本类实例访问本类的一静态属性

对于public修饰的属性或者方法,还是很宽松的。我们在类的外部既可以通过 类名称 :: 类静态属性 来获取,也可以 类实例 :: 类静态属性 来获取。

  1. <?php
  2. class Father
  3. {
  4. public static $a = 'a 属性';
  5. protected static $b = 'b 属性';
  6. private static $c = 'c 属性';
  7. }
  8. $fa = new Father();
  9. // 子类访问静态属性
  10. echo ($fa::$a) . '</br>'; // a属性
  11. // 类名访问静态属性
  12. echo (Father::$a) . '</br>'; // a属性

同样的如果想是用下面的这种方式去访问,还是不行的。

  1. echo ($fa::$b) . '<br>';
  2. echo (Father::$b) . '<br>';

按照前面的思路,这样去写。PHP中,在类里面我们可以通过三种方式来获取静态属性:1. 类名称 :: 静态属性名称2. self :: 静态属性名称 3. static :: 静态属性名称

  1. <?php
  2. class Father
  3. {
  4. public static $a = 'a 属性';
  5. protected static $b = 'b 属性';
  6. private static $c = 'c 属性';
  7. public function getPropertyB() {
  8. return self::$b;
  9. }
  10. public function getPropertyC() {
  11. return static::$c;
  12. }
  13. }
  14. $fa = new Father();
  15. echo $fa->getPropertyB() . '</br>'; // b 属性
  16. echo $fa->getPropertyC() . '</br>'; // c 属性

如过你实在是闲的蛋疼,其实也可以在类中使用实例去获取,这不过这还需要去 new

  1. <?php
  2. class Father
  3. {
  4. public static $a = 'a 属性';
  5. protected static $b = 'b 属性';
  6. private static $c = 'c 属性';
  7. public function getPropertyB() {
  8. return (new Father())::$b;
  9. }
  10. public function getPropertyC() {
  11. return (new Father())::$c;
  12. }
  13. }
  14. $fa = new Father();
  15. echo $fa->getPropertyB() . '</br>'; //
  16. echo $fa->getPropertyC() . '</br>'; //

1.3 本类实例访问本类的一非静态方法

我发现一个很有意思的事情:我们竟然可以通过静态的方式去访问非静态的方法,但是抛出了不赞成,哈哈

  1. <?php
  2. class Father
  3. {
  4. public function A()
  5. {
  6. echo 'A() is called' . '</br>';
  7. }
  8. protected function B()
  9. {
  10. echo 'B() is called' . '</br>';
  11. }
  12. private function C()
  13. {
  14. echo 'C() is called' . '</br>';
  15. }
  16. }
  17. $fa = new Father();
  18. // 对于A(),我们还是轻易的访问到了
  19. $fa->A(); // A() is called
  20. // 我想让通过静态的方式访问非静态的方法,看下行不行(针对于public这个宽松的条件)
  21. $fa::A(); // Deprecated: Non-static method Father::A() should not be called statically in D:\wamp64\www\JS\6.6\1_3-test.php on line 27

我很好奇,然后我们看看下面的代码。通过下面的代码我们似乎可以得出一个结论。无关乎与访问权限控制符,PHP中我们就是可以用静态的方式去调用非静态的方法,但是这是不赞成的

  1. <?php
  2. class Father
  3. {
  4. public function A()
  5. {
  6. echo 'A() is called' . '</br>';
  7. }
  8. protected function B()
  9. {
  10. echo 'B() is called' . '</br>';
  11. }
  12. private function C()
  13. {
  14. echo 'C() is called' . '</br>';
  15. }
  16. public function test1()
  17. {
  18. self::A();
  19. }
  20. public function test2()
  21. {
  22. self::B();
  23. }
  24. public function test3()
  25. {
  26. self::C();
  27. }
  28. }
  29. (new Father()) -> test1(); // A() is called
  30. (new Father()) -> test2(); // B() is called
  31. (new Father()) -> test3(); // C() is called

回到正题,我们如何在类外部去访问受保护的和私有的非静态方法呢,这不还是同一个道理吗。代码如下

  1. <?php
  2. class Father
  3. {
  4. public function A()
  5. {
  6. echo 'A() is called' . '</br>';
  7. }
  8. protected function B()
  9. {
  10. echo 'B() is called' . '</br>';
  11. }
  12. private function C()
  13. {
  14. echo 'C() is called' . '</br>';
  15. }
  16. public function callMethodB()
  17. {
  18. (new Father())->B();
  19. }
  20. public function callMethodC()
  21. {
  22. (new Father())->C();
  23. }
  24. }
  25. $fa = new Father();
  26. $fa ->callMethodB(); // B() is called
  27. $fa ->callMethodC(); // C() is called

1.4 本类实例访问本类的一静态方法

  1. <?php
  2. class Father
  3. {
  4. public static function A()
  5. {
  6. echo 'A() is called' . '</br>';
  7. }
  8. protected static function B()
  9. {
  10. echo 'B() is called' . '</br>';
  11. }
  12. private static function C()
  13. {
  14. echo 'C() is called' . '</br>';
  15. }
  16. public static function callMethodB()
  17. {
  18. self::B();
  19. }
  20. public static function callMethodC()
  21. {
  22. self::C();
  23. }
  24. }
  25. // 对于A
  26. Father::A();
  27. // 对于B和C
  28. Father::callMethodB();
  29. Father::callMethodC();

1.5 本类实例访问本类的一常量

这个就只说不写算了。PHP中的类中的常量只可以用 const 关键来定义,在其他地方我们也可以通过define() 函数来定义一个常量,不管是不是在类中去定义一个常量,我们都应该使用const而 抛弃define()函数,不仅仅是因为性能存在差异,而且const从命名上就更加直观。
const DA_XIE = 'xxx'; 我们不用加上$这个美元符,也不用加上访问权限控制符(这是因为对象直接访问类常量,也就是说类常量本质上就是给类服务的)。
名称全大写_隔开。
调用的方式:和静态属性一样三种调用方式都可以,不像大部分人垃圾博客说来说去的就说的那两种,也可以是 static :: 常量名称
它是只读的,不可以改,所以定义的时候一定要直接赋予初始值

  1. // 没啥好写的
  2. <?php
  3. class Father
  4. {
  5. const A = 'A';
  6. public static function getConstA_1()
  7. {
  8. echo static::A . '<br>';
  9. }
  10. public static function getConstA_2()
  11. {
  12. echo self::A . '<br>';
  13. }
  14. public static function getConstA_3()
  15. {
  16. echo Father::A . '<br>';
  17. }
  18. }
  19. Father::getConstA_1(); // A
  20. Father::getConstA_2(); // A
  21. Father::getConstA_3(); // A

1.6 小节

  • 本类实例访问本类的一非静态属性

    • 只可以访问到 Public 修饰的属性
  • 本类实例访问本类的一静态属性

    • 只可以访问到 Public 修饰的属性
  • 本类实例访问本类的一非静态方法

    • 只可以访问到 Public 修饰的属性
  • 本类实例访问本类的一静态方法

    • 只可以访问到 Public 修饰的属性
  • 本类实例访问本类的一类常量

    • 实例无法访问到类中的常量