PHP构造函数

若类中没有定义构造函数,则此类实例化对象时是不调用构造函数的,即类实例化对象时未必调用构造函数。你们认为我的想法是对的吗?

阅读 4.4k
5 个回答

有构造函数会自动调用构造函数,没有就不调

类中没有构造方法,在实例化类的时候会自动创建一个构造方法。只是这个构造方法没有方法体,啥也不做。

__construct应该是默认都会有的,没有内容就执行空的方法咯。

class类定义了构造函数的话php底层自动执行构造方法 没有定义就不会执行

我通过枚举各种可能,得出结论,类实例化对象时是不是一定执行构造函数的问题根本不重要。下面是我的测试:
一、类中要么不提供构造函数,要么只提供一个构造函数
实例一:没有提供构造函数
<?php
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();
?>

实例二:提供无参构造函数
<?php
class Site {

var $url;
var $title;
function __construct(){echo"调用无参构造函数<br/>";}
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();
?>

实例三:提供有参构造函数
<?php
class Site{

var $url;
var $title;
function __construct( $par1, $par2 ){
    echo"调用有参构造函数<br/>";
    $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();
?>

二、继承父类的构造函数
实例:
<?php
class Site{

var $url;
var $title;
function __construct( $par1, $par2 ){
    echo"调用有参构造函数<br/>";
    $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();
?>

三、重写父类的构造函数
实例一:没有执行父类的构造函数
<?php
class Site{

var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
    echo"调用有参构造函数<br/>";
    $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::构造函数<br/>";
}

}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>

实例二:执行父类的构造函数
<?php
class Site{

var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
    echo"调用有参构造函数<br/>";
    $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::构造函数<br/>";
}

}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>

实例三:执行父类的构造函数
<?php
class Site{

var $url="null";
var $title="空的";
function __construct( $par1, $par2 ){
    echo"调用有参构造函数<br/>";
    $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::构造函数<br/>";
}

}
$runoob = new B('www.runoob.com',"菜鸟教程");
$runoob->getUrl();
$runoob->getTitle();
?>

四、构造函数访问权限
实例一:
<?php
class A{

function __construct(){echo "correct ";}

}
new A;
?>

实例二:
<?php
class A{

public function __construct(){echo "correct ";}

}
new A;
?>

实例三:
<?php
class A{

protected function __construct(){echo "correct ";}

}
//new A;//error
?>
实例四:
<?php
class A{

//private function __construct(){echo "correct ";}//error

}
new A;
?>
实例五:
<?php
class A{

protected function __construct(){echo "correct ";}

}
class B extends A{

function __construct(){
    A::__construct();
    parent::__construct();
}

}
new B;
?>

注:将protected删除或改为public都一样。

推荐问题