类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。
PHP和JavaScript中都有class。同为class类,它们有什么区别呢?
一、JS中的class类
JS的class是一个语法糖。说到JS中的class,就不得不说function,二者都是用来定义构造函数,而class让对象原型的写法更加清晰。
<script>
//定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return this.x + ', ' + this.y;
}
}
var p = new Point(1, 2);
console.log(p.toString());
</script>
以上代码在控制台输出如下:
以上这段代码定义了一个类,有一个constructor方法,即构造方法,而this关键字代表实例对象。
在JS面向对象中,出身于ES6中的class,与function相比,有下面的特点:
- class 写法更加简洁、含义更加明确、代码结构更加清晰。
- class 尽管也是函数,却无法直接调用,因此不存在防御性代码了
- class 不存在变量提升
- class 为污染 window 等全局变量
- class 函数体中的代码始终以严格模式执行,于是提高了代码可靠性
- 可直接使用 set 和 get 函数
- class 内部方法中若涉及到 this时,class 中的 this 永远都不会指向 window
- class 可以从 javascript 中几大类中进行继承:Array、number、string....
- class 中有一个对象,可以取到父类的方法、构造函数
二、PHP中的类
PHP中有两个重要的角色:类与对象。类是一种抽象的概念,先有类再有对象,通过new类得到一个对象,类似于JS面向对象中的构造函数,是函数模板,为对象提供基本结构。
PHP中也有构造函数,但与JS中的构造函数不同,当函数与类同名时,这个函数将成为构造函数。如果一个类没有构造函数,则调用基类(即父类)的构造函数,如果有的话,则调用该构造函数。
<?php
class Phone
{
public function callEmer()
{
echo __METHOD__,'<br/>';
}
public function call()
{
echo __METHOD__,'<br/>';
}
public function facetime()
{
echo __METHOD__,'<br/>';
}
}
三、构造方法
constructor构造方法是类的默认方法。
在JavaScript中,通过new命令生成对象实例时,自动调用构造方法,默认返回实例对象,即this,返回值也可以指定返回另一个对象,但不建议修改。
在PHP中,构造方法在实例化一个对象时,由实例化出来的对象隐式调用(Php在执行中自己调用的)。如果构造方法有形参,那么在实例化类时,就必须传递。
四、this关键字
1.JavaScript中的this
在JS中,this是谁调用指向谁,this指向的只可能是对象,不能是函数,调用规律如下:
- 通过函数名()调用的,this永远指向window;
- 通过对象.方法调用的,this指向这个对象;
- 函数作为数组的一个元素,用数组下标调用,this指向这个数组;
- 函数作为window内置函数的回调函数使用,this指向window;
- 函数作为构造函数,使用new关键字调用,this指向新new出的对象。
2.PHP中的this
在PHP中,用于类的内部指代类的本身。来访问属性或方法或常量,如下:
- 成员属性:this−>属性名
- 成员方法:this−>方法名
this还可以用在该类的子类中,来指代本身的属性或方法。