1. 本类的实例访问本类
1.1 本类实例访问本类的一非静态属性
<?phpclass Father{public $a = 'a 属性';protected $b = 'b 属性';private $c = 'c 属性';}$fa = new Father();echo ($fa->a) . '<br>'; // a属性echo ($fa->b) . '<br>'; // 无法访问 受保护的属性echo ($fa->c) . '<br>'; // 无法访问 私有的的属性
我们轻易的就发现了一个问题,那就是类的实例只能访问类的公共方法。其实仔细一想这一点也很好理解啊。public 修饰的是一个公共的它是可以随意在类的外部被访问到的。_protected 受保护的:可以在当前类和当前类的子类中访问。可没有说的是类的外部。private就更不用说了,我们如果想要在类的外部访问 protected、private修饰的方法。我们通常这样做:在类的内部提供一个公有的方法_,我们通过这个公有的方法来获取。
如下面的代码:我们利用的是在类中,我们可以轻易的获取任何权限修饰的属性或者方法
<?phpclass Father{public $a = 'a 属性';protected $b = 'b 属性';private $c = 'c 属性';public function getPropertyB(){return (new Father())->b;}public function getPropertyC(){return (new Father())->c;}}$fa = new Father();echo $fa->getPropertyB(); // b 属性echo $fa->getPropertyC(); // c 属性
1.2 本类实例访问本类的一静态属性
对于public修饰的属性或者方法,还是很宽松的。我们在类的外部既可以通过 类名称 :: 类静态属性 来获取,也可以 类实例 :: 类静态属性 来获取。
<?phpclass Father{public static $a = 'a 属性';protected static $b = 'b 属性';private static $c = 'c 属性';}$fa = new Father();// 子类访问静态属性echo ($fa::$a) . '</br>'; // a属性// 类名访问静态属性echo (Father::$a) . '</br>'; // a属性
同样的如果想是用下面的这种方式去访问,还是不行的。
echo ($fa::$b) . '<br>';echo (Father::$b) . '<br>';
按照前面的思路,这样去写。PHP中,在类里面我们可以通过三种方式来获取静态属性:1. 类名称 :: 静态属性名称 、2. self :: 静态属性名称 、3. static :: 静态属性名称
<?phpclass Father{public static $a = 'a 属性';protected static $b = 'b 属性';private static $c = 'c 属性';public function getPropertyB() {return self::$b;}public function getPropertyC() {return static::$c;}}$fa = new Father();echo $fa->getPropertyB() . '</br>'; // b 属性echo $fa->getPropertyC() . '</br>'; // c 属性
如过你实在是闲的蛋疼,其实也可以在类中使用实例去获取,这不过这还需要去 new
<?phpclass Father{public static $a = 'a 属性';protected static $b = 'b 属性';private static $c = 'c 属性';public function getPropertyB() {return (new Father())::$b;}public function getPropertyC() {return (new Father())::$c;}}$fa = new Father();echo $fa->getPropertyB() . '</br>'; //echo $fa->getPropertyC() . '</br>'; //
1.3 本类实例访问本类的一非静态方法
我发现一个很有意思的事情:我们竟然可以通过静态的方式去访问非静态的方法,但是抛出了不赞成,哈哈
<?phpclass Father{public function A(){echo 'A() is called' . '</br>';}protected function B(){echo 'B() is called' . '</br>';}private function C(){echo 'C() is called' . '</br>';}}$fa = new Father();// 对于A(),我们还是轻易的访问到了$fa->A(); // A() is called// 我想让通过静态的方式访问非静态的方法,看下行不行(针对于public这个宽松的条件)$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中我们就是可以用静态的方式去调用非静态的方法,但是这是不赞成的
<?phpclass Father{public function A(){echo 'A() is called' . '</br>';}protected function B(){echo 'B() is called' . '</br>';}private function C(){echo 'C() is called' . '</br>';}public function test1(){self::A();}public function test2(){self::B();}public function test3(){self::C();}}(new Father()) -> test1(); // A() is called(new Father()) -> test2(); // B() is called(new Father()) -> test3(); // C() is called
回到正题,我们如何在类外部去访问受保护的和私有的非静态方法呢,这不还是同一个道理吗。代码如下
<?phpclass Father{public function A(){echo 'A() is called' . '</br>';}protected function B(){echo 'B() is called' . '</br>';}private function C(){echo 'C() is called' . '</br>';}public function callMethodB(){(new Father())->B();}public function callMethodC(){(new Father())->C();}}$fa = new Father();$fa ->callMethodB(); // B() is called$fa ->callMethodC(); // C() is called
1.4 本类实例访问本类的一静态方法
<?phpclass Father{public static function A(){echo 'A() is called' . '</br>';}protected static function B(){echo 'B() is called' . '</br>';}private static function C(){echo 'C() is called' . '</br>';}public static function callMethodB(){self::B();}public static function callMethodC(){self::C();}}// 对于AFather::A();// 对于B和CFather::callMethodB();Father::callMethodC();
1.5 本类实例访问本类的一常量
这个就只说不写算了。PHP中的类中的常量只可以用 const 关键来定义,在其他地方我们也可以通过define() 函数来定义一个常量,不管是不是在类中去定义一个常量,我们都应该使用const而 抛弃define()函数,不仅仅是因为性能存在差异,而且const从命名上就更加直观。const DA_XIE = 'xxx'; 我们不用加上$这个美元符,也不用加上访问权限控制符(这是因为对象直接访问类常量,也就是说类常量本质上就是给类服务的)。
名称全大写_隔开。
调用的方式:和静态属性一样三种调用方式都可以,不像大部分人垃圾博客说来说去的就说的那两种,也可以是 static :: 常量名称
它是只读的,不可以改,所以定义的时候一定要直接赋予初始值
// 没啥好写的<?phpclass Father{const A = 'A';public static function getConstA_1(){echo static::A . '<br>';}public static function getConstA_2(){echo self::A . '<br>';}public static function getConstA_3(){echo Father::A . '<br>';}}Father::getConstA_1(); // AFather::getConstA_2(); // AFather::getConstA_3(); // A
1.6 小节
本类实例访问本类的一非静态属性
- 只可以访问到 Public 修饰的属性
 本类实例访问本类的一静态属性
- 只可以访问到 Public 修饰的属性
 本类实例访问本类的一非静态方法
- 只可以访问到 Public 修饰的属性
 本类实例访问本类的一静态方法
- 只可以访问到 Public 修饰的属性
 本类实例访问本类的一类常量
- 实例无法访问到类中的常量
 
