首页 > 代码库 > 对【面向对象的类访问和对象访问的区别【this以及类访问】、静态成员的访问区别、类常量等、继承和重写、访问修饰限定符、冒泡排序】的总结

对【面向对象的类访问和对象访问的区别【this以及类访问】、静态成员的访问区别、类常量等、继承和重写、访问修饰限定符、冒泡排序】的总结

面向对象的总结
1.首先面向对象的编程使用的都是使用对象作为处理对象而言【例如继承等情形,继承的本质来说,依旧针对的是对象】
但是只有针对类的访问、静态成员以及访问修饰限定符时,针对的是类的概念

2.类内定义时,只有五种情形:
类常量【const关键字定义并且使用类来调用】
属性【这些属性和方法是针对该类实例的对象来调用】
方法【在这种情形下使用$this进行指代作用环境(调用该方法的对象),只有继承中,子类实例的对象会向下传递到静态调用里】
静态属性【用来作为实例该类的所有对象之间共享的数据。保存在类中】
静态方法


3.对象
通过构造函数进行对象中的属性的初始化工作,尽量少的在构造函数中定义方法,如果必须使用的话,也要使用构造函数调用外部的方法进行调用。【这样能够更好的扩展】


4.关于静态与非静态成员的区别
主要表现在静态属性和非静态属性的使用上。
static关键字进行定义

针对静态和非静态成员的调用区别:
静态成员对应的是类调用【::】【这里使用的调用有self/parent还有类名进行调用】
非静态成员对应的是对象调用【->】对象调用本身在类外调用使用对象名,在类内调用使用$this进行指代【能够更好的封装和独立性】

因为静态方法和非静态方法的模糊性,所以能够将他们相互之间混合调用【但是不建议这样使用】
【非静态方法和静态方法的区别并不明显,因为该方法本身都是处于编码区域,即使是对象调用非静态方法也不是单独创建区域,所以针对非静态方法与静态方法的区别就是在于:在方法中使用$this的指代,当然即使这样,也能被用来在静态访问的方法来指代(用于环境向下传递中,虽然这种用法很少被使用)】


5.继承【extends】
继承本身在php中实现层面上是一个对象的概念。【相当于一个继承链。这一点在js上也比较类似】
【继承链本身就是对象的概念,但是因为php需要使用类来实现对象的语法,所以表现成类的继承】


继承中的重写机制【只有private的父类也不会被子类重写,而是继承子类中拥有两个private的属性】
这里的重写也是在继承链上找寻该对应的属性的值。【这个和js一致】【能够保证子对象个性之余,也能保证子对象的重写对父类的原本定义不冲突,也不影响】


6.$this的确定
(1)真实调用非静态方法中使用的$this指代的就是调用该静态方法的对象
(2)两个类之间出现,一个类中使用另一个类名调用该类上的方法【非静态方法,因为我们假定现实使用$this指代的情形就只会发生在非静态方法调用中】【这种情形下的$this指代的是子类的对象】
【继承链的存在来确定这种调用情形的$this作用环境】


7.访问修饰限定符
需要注意的是,在访问修饰限定符的情景下,我们需要注意的就是这个概念限定的就是类的层面上。
【因为访问修饰限定符本身就是指的是对类内定义的成员的访问权限,所以才会在类上,因为正因为类是设计对象的语法,这样的限制也只有在类的层面上进行设置才能起效果】

这里的访问限定指的就是:
类内
继承链上类内
类外
而且判断在哪里访问指的就是访问该代码的位置【因为针对封装情况来说,代码访问位置才是对其限制的依据】

例如:
<?php
class A {
public function in_a_func() {
var_dump($this->property);//在A类中,在父类中(继承链)访问
}
}
class B extends A {
//成员定义在B类!
// public $property = ‘public property<br>‘;
// protected $property = ‘protected property<br>‘;
private $property = ‘private property<br>‘;
public function in_b_func() {
var_dump($this->property);//在B类中访问,在本类内访问
}
}
class C extends B {
public function in_c_func() {
var_dump($this->property);//在C类内访问,在子类(继承链)上访问
}
}
$c = new C;
//var_dump($c->property);//访问这个位置先是查找C类中的property属性,但是没有找到,相应地找到B类中的属性,但是b类中式private,所以不能够显示。null
//$c->in_c_func();//在继承链上的子类内访问private $property
//$c->in_b_func();//在本类内访问private $property
//$c->in_a_func();//在继承链上的父类内访问private $property

以上的原理就是告诉我们,因为是private的属性值,所以只有在b类中访问,也就是调用了in_b_func方法之后,才能访问到property属性。其他的情况都不行。【只有这种情形才会限定的最好】
【因为以上的三个类之间的继承关系决定了private才能限制使用$c对象访问时,调用到$property属性的能力。只要是public或者protected等都可以被访问到】


而关于该属性被访问的问题和$this指向哪个对象并没有关系【这也是将访问修饰限定符的作用定在类上的原因】

 

【总结:访问修饰限定符在继承情形下的不同情况】
所以只需要注意private的属性的不能被重写的问题,以及private属性的访问限制即可。【就是保证类内的访问才能正常被访问,和什么对象环境没有关系】
而现实中private并不多使用。
【而使用public和protected的属性只需要注意继承链和重写机制对访问的限制即可。即优先查找的那个属性的值,然后逐层进行属性的查找,这才是访问需要注意的问题】
【而继承链造就的重写机制就是保证访问的优先级,而且能够保证子类的个性化】
【另外需要注意的就是继承下的重写机制中,属性不能比父类的原本属性的权限更低(即父类如果使用public,那么子类只能使用public来限定)】

 


【另外还有的就是冒泡排序:每一轮对相邻两个数进行对比,每一轮找出一个最大(小)的数,放在最右(左)。要进行n-1轮实现】
算法非常简单,双重嵌套实现。

 

对【面向对象的类访问和对象访问的区别【this以及类访问】、静态成员的访问区别、类常量等、继承和重写、访问修饰限定符、冒泡排序】的总结