PHP的语言特性-面向对象和C++/java/python的相似之处

来源:互联网 发布:快递员抢单软件 编辑:程序博客网 时间:2024/04/29 21:44

1.script

弱类型

  因为是弱类型,在函数的参数类型比较灵活,写一个函数可以顶得上C++/java好几个函数(在C++/java里面有个名词overload).

   当然在PHP的类里面,也可以使用类型提示来限定参数的类型。

在函数方法的参数方面,也使用了by reference,by value的概念,避免使用指针这种容易出问题的东西。

(by reference,by value看起来好面熟,在vb里面用过。)


可变变量,可变函数


函数式动态语言(基本上现在的script语言都是这样,js,python,等等)

引入了协程yield, generator(类似于python,golang)


2.面向对象特性-糅合C++/java/python

大多数面向对象的特性都和C++/java/python类似,下面说说其中的几个方面a-j

a.成员访问运算符(C++)

使用C++的箭头运算符

  ->

而不是java的点运算符。


b.class,extends这些都是C++/java


c.不支持C++那样的多重继承,而是采用java那样的interface(类似于java)

implements interface


d.使用默认构造函数和析构函数,使用默认的属性访问器函数(类似于python)

__construct()

__construct($param)

__destruct()


__set($name,$value)

__get($name)

这些和python类似

类的实例化仍然是new, 这个没有必要创新。

e.per-class const, per-class method使用C++中常见的::操作符

<?phpclass Math {  const pi = 3.14159;}echo " Math::pi = ".Math::pi."\n";?>


static关键字用于per-class method
类似于java
php真的是便宜行事的语言,哈哈哈。

f.namespace类似于C++
g.PHP5.3引入late static binding(延迟静态绑定)
感觉和C++的动态绑定很类似,但是好像更加方便一点点简洁一点点。

<?phpclass A {public static function who() {echo __CLASS__;}public static function test() {static::who(); // Here comes Late Static Bindings}}class B extends A {public static function who() {echo __CLASS__;}}A::test();B::test();?>


C++ V-table (Virtual function table)

当C++程式呼叫非虚函数, 采用与C程式呼叫函数所用方式一样的静态绑定来呼叫函数。 但是C++程式 若是透过指向类别的指针来呼叫虚函数时, 编译程式则采用所谓的晚期绑定(late binding)或静态绑定 (static binding)技术来呼叫函数。

而C++虚函数用虚函数表(virtual function table), 或称V-表来实作动态绑定, 所谓的V-表是一 个函数指针的阵列, 这是编译程序替每个使用虚函数的类所建制的。

Java跨越边界: 延迟绑定

用 Java 语言延迟绑定

Java 社区对静态类型检查的迷恋程度令人惊讶,Java 程序员们正在不遗余力地寻找延迟绑定的方式。有些方法是成功的。诸如 Spring 等框架的存在主要是为了延迟绑定,它有助于减缓客户机和服务之间的耦合。面向方面的编程通过提供能够扩展类的功能(甚至可以超出其当前的功能)的服务来实现延迟绑定。像 Hibernate 这样的框架也可以延迟绑定,通过反射、代理和其他工具在运行时将持久性功能添加到纯粹、普通的 Java 对象(POJO)中。现在有很多关于如何用 POJO 编程的流行书籍可供开发人员参考,这些书籍大多会使用愈加复杂的技术(比反射还要先进),而这些技术主要是为了打开类并延迟绑定,从而有效地回避了静态类型。

上面2006年发表的文章很老了,但是他的说法依然很有价值。

java8已经加入了很多好玩的特性,比如lamda表达式。

groovy/scala是jvm上面的动态语言,这5年来的发展也很快,可能也是另外一个好选择。

h.clone关键字用于clone对象
还有__clone()方法
让我想起了java里面的clone()方法,以及shallow clone/deep clone的概念。
默认是deep clone,如果类成员属性是复杂类型,就需要考虑deep clone,也就是通过override cloen()函数。

i.抽象类
PHP的抽象类比较奇葩,只能包含抽象方法。
java里面也叫做抽象方法,不过java的抽象类可以有非抽象方法。相同的一点点是抽象类本身不能有实例对象,这就是抽象类的抽象含义。
C++里面抽象方法叫做纯虚函数。

j.overloading vs. overriding
两者在中文里面都叫做重载,但是在英文里面可以区分,他们是两回事情。
orverloading在C++/java中很普遍,因为是强类型。
overloading在PHP这种弱类型语言里面很少用到。

3.视觉上面有时候感觉比较不习惯的几个地方
a.$符号
$符号加上字符串,这就是一个变量名或对象名,例如下面的代码:
class MyClass{  private $_val;  public function foo(){    return $this->_val;  }  public function foo1(){    return $this->_val;  }  ......}$my = new MyClass;echo $my->foo();
说明:MyClass是个类名,不用加$符号,$_val是个私有变量,一般是以$加下划线加字符串组成的,foo和foo1是两个成员函数,不用加$符号,$my是一个对象,必须加$符号,

b. php中的this和箭头符号
在类中经常遇到this关键词,如何去理解它了!
         $this关键字是用来访问当前对象中的对象属性和对象方法的系统变量!
         有三层意思:
         1.它是一个变量。2.只能在对象中使用。3.可以访问属性和方法!
箭头符号->:
          ―>一般用在数据类型为类的后面,数据类型包括变量、数组、类,它可以很方便的调用类的方法和属性!

<?phpclass a{   function test()    {      echo "this is a test!";    }}$b = new a;     //对象实例化$b -> test();   //调用对象中的方法 test()?>


-------------------------------------------------------
->:这个是调用类中的方法
=>:这个是数组的键值对中间的标志
?: :这个是三目运算符,a?b:c 表示的是 if(a){b}else{c}
-------------------------------------------------------
PHP 数组中=> , 左边表示索引,右边表示键值;
参考:
<?php #这个一维数组你定义的没有错 $myarray = array("a","b","c"); print_r($myarray); #表示你定义了一个二维数组 $MyArray2 = array(  "地支" => array("子", "丑", "寅", "卯"),  "生肖" => array("鼠", "牛", "虎", "兔"),  "数字" => array(1, 2, 3, 4));?>


c. php的注释
  //在PHP中如何注释
  1。在#以后的一行都被注释
  ########################
  ####   以#号注释   #####
  ########################


  2。单行注释
  //反斜杠


  3。可以多行注释
  /*以C语言注释方式
  */

d. 双冒号
和C++里面的双冒号类似,不用实例化直接调用类的方法/常量
0 0
原创粉丝点击