.NET程序員學PHP要注意的坑-類、接口

<?php
/*
 * PHP OOP
 *
 */
//
//訪問屬性、方法用->符號,obj->Method()
//靜態成員:self::Method()
//$this對象自己的引用,$this->Method()
//php

class Widget
{
    private $_id = 0;
    private $_name = '';
    private $_description = '';
    private static $s_StaticVar = 1;c#

    public function __construct($widgetId)      //構造函數
    {
        $this->_id = $widgetId;
        echo 'Widget__construct';
    }函數

    public function getId()         //慣例:自定義存取器
    {
        return $this->_id;
    }this

    public function setId($widgetId)
    {
        $this->_id = $widgetId;
    }對象

    public function getName()
    {
        return $this->_name;
    }繼承

    public function setName($name)
    {
        $this->_name = $name;
    }接口

    public function getDescription()
    {
        return $this->_description;
    }ip

    public function setDescription($description)
    {
        $this->_description = $description;
    }get

    public function ParseHtml()
    {
        echo "Id:$this->_id, Name:$this->_name, Description:$this->_description, StaticTest:" .self::$s_StaticVar;
        self::$s_StaticVar++;        //訪問靜態成員又須要這個$了
    }io

    public function __destruct()        //析構函數
    {
        echo "__destruct";
    }
}
//
$test = new Widget(1);
$test->ParseHtml();
// $test2 = $test;
// $test2->ParseHtml();
$test3 = new Widget(1);
$test3->ParseHtml();            //類對象共享靜態字段

/*
 * 繼承以後,構造函數、析構函數的調用順序??
 * 並不會自動調用父類構造函數,要子類本身調用
 *
 */
class pageWidget extends Widget
{
    public function __construct($widgetId, $name, $desc)
    {
        parent::__construct($widgetId);
        echo 'pageWidget__construct';
        parent::setName($name);
        parent::setDescription($desc);      //parent::訪問父類,對應c#的base
    }

    public function __destruct()    //屬於重寫了父類析構
    {
        parent::__destruct();       //只能子類主動調用了
    }

    public function ParseHtml()     //重寫父類方法
    {
        parent::ParseHtml();
        echo "(我能呵呵一下嗎)";
    }
}
//
$pageWidget = new pageWidget(1, 'Hello', 'Hello world');
$pageWidget->ParseHtml();
//
//
/*
 * 接口
 * PHP不支持多繼承,那能單繼承類,實現多接口嗎??對比C#
 * 接口沒有成員變量===和C#不一樣
 * 方法是abstract的
 */
interface IOpenable
{
    function Open();
    function Close();
}

interface IEnumerable
{
    function GetEnumerator();
}
/*
 * 繼承一個類實現多個接口是能夠的
 * 這個子類沒有自定義構造函數,可是,在實例化的時候,卻能夠利用父類的構造函數
 * 看下面的註釋
 */
class TestInterface extends Widget implements IOpenable, IEnumerable
{
    public function Open()      //如何顯式說明屬於IOpenable接口??==========
    {

    }

    public function Close()
    {

    }

    public function GetEnumerator()
    {

    }

}/* * 能夠指定函數參數的類型 */function paramTypeTest(TestInterface $interface){    $interface->ParseHtml();}//paramTypeTest(new TestInterface(1));    //TestInterface自己沒有這樣的構造,可是能夠這樣利用父類的構造函數,汗...好自由////

相關文章
相關標籤/搜索