转到正文

浪淘沙

静观己心,厚积薄发

存档

2015 年 5 月 的存档

PHP支持OOP编程,这大家都知道。但是PHP的继承和JAVA还是有点区别的。比较致命的一点就是:如果子类(ExtendsB)显示实现构造方法,那么在实例化ExtendsB的时候,系统并不会主动调用父类(ExtendsA)的构造方法

如果必须调用父类构造方法有2种方法:

1、子类(ExtendsB)中不实现构造方法(及时子类不要空实现构造方法)

2、自己手动调用父类构造方法(parent::__construct();)

直接上例子吧。

<?php
class ExtendsA {
    protected $c;

    public function ExtendsA(){
        $this->c = 10;
    }
}

class ExtendsB extends ExtendsA{
    //public function b(){} //这行解注释 就不会打印东西出来。因为ExtendsA构造没有被执行
    public function print_data(){
        echo $this->c;
    }
}

$b = new ExtendsB();
$b->print_data();

而JAVA代码就不是这样的。无论是否实现构造方法,再实例化子类的时候,系统都会递归调用父类构造方法。

public class ExtendsTestMain {

    public static void main(String args[]) {
        ExtendsTestB b = new ExtendsTestB();
        b.printData();
    }
}

class ExtendsTestA {

    protected int c;

    public ExtendsTestA() {
        c = 10;
    }
}

class ExtendsTestB extends ExtendsTestA {

    public ExtendsTestB() {

    }

    public void printData() {
        System.out.println(c);
    }
}

 

今天面试被问到一个问题。问题是这样的:“一个数组里面有正整数和负整数,对这个数组进行排序,要求,距离100比较近的排在前面。比如102距离100为2,90距离100为10,所以102排在90前面。”

这个算法很简单,下面直接给出我的程序:


function cmp($a, $b)
{
    $ta = abs(100-$a);
    $tb = abs(100-$b);
    if ($ta == $tb) {
        return 0;
    }
    return ($ta < $tb) ? -1 : 1;
}

$origin = array(
    100,0,-10,-20,-30,10,30,50,80,90,102,98
);

usort($origin, "cmp");

foreach ($origin as $key => $value) {
    echo "{$key}=>{$value}<br/>";
}

打印结果如下:


0=>100
1=>102
2=>98
3=>90
4=>120
5=>80
6=>130
7=>50
8=>30
9=>10
10=>0
11=>-10
12=>-20
13=>-30