我通过枚举各种可能,得出结论,类实例化对象时是不是一定执行构造函数的问题根本不重要。下面是我的测试:
一、类中要么不提供构造函数,要么只提供一个构造函数
实例一:没有提供构造函数
class Site{
var $url;
var $title;
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
$runoob = new Site;//也可写成$runoob = new Site();
$runoob->setUrl( 'www.runoob.com' );
$runoob->setTitle( "菜鸟教程" );
$runoob->getUrl();
$runoob->getTitle();
?>
实例二:提供无参构造函数
class Site {
var $url;
var $title;
function __construct(){echo"调用无参构造函数
";}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
$runoob = new Site;//也可写成$runoob = new Site();
$runoob->setUrl( 'www.runoob.com' );
$runoob->setTitle( "菜鸟教程" );
$runoob->getUrl();
$runoob->getTitle();
?>
实例三:提供有参构造函数
class Site{
var $url;
var $title;
function __construct( $par1, $par2 ){
echo"调用有参构造函数
";
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
$runoob = new Site('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>
二、继承父类的构造函数
实例:
class Site{
var $url;
var $title;
function __construct( $par1, $par2 ){
echo"调用有参构造函数
";
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
class B extends Site{}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>
三、重写父类的构造函数
实例一:没有执行父类的构造函数
class Site{
var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
echo"调用有参构造函数
";
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
class B extends Site{
function __construct($par1, $par2){
echo "B::构造函数
";
}
}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>
实例二:执行父类的构造函数
class Site{
var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
echo"调用有参构造函数
";
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
class B extends Site{
function __construct($par1, $par2){
parent::__construct( $par1, $par2 );
echo "B::构造函数
";
}
}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>
实例三:执行父类的构造函数
class Site{
var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
echo"调用有参构造函数
";
$this->url = $par1;
$this->title = $par2;
}
function setUrl($par){$this->url = $par;}
function getUrl(){echo $this->url . PHP_EOL;}
function setTitle($par){$this->title = $par;}
function getTitle(){echo $this->title . PHP_EOL;}
}
class B extends Site{
function __construct($par1, $par2){
Site::__construct( $par1, $par2 );
echo "B::构造函数
";
}
}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>
四、构造函数访问权限
实例一:
class A{
function __construct(){echo "correct ";}
}
new A;
?>
实例二:
class A{
public function __construct(){echo "correct ";}
}
new A;
?>
实例三:
class A{
protected function __construct(){echo "correct ";}
}
//new A;//error
?>
实例四:
class A{
//private function __construct(){echo "correct ";}//error
}
new A;
?>
实例五:
class A{
protected function __construct(){echo "correct ";}
}
class B extends A{
function __construct(){
A::__construct();
parent::__construct();
}
}
new B;
?>
注:将protected删除或改为public都一样。