<?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自己沒有這樣的構造,可是能夠這樣利用父類的構造函數,汗...好自由////