php类继承构造函数
1. php中owner什么意思
请看PHP手册18章,里面的内容你看了就明白。
第18章类与对象(PHP4)
目录
类
继承
构造函数
范围解析操作符(::)
parent
序列化对象-会话中的对象
魔术函数__sleep和__wakeup
构造函数中的引用
对象的比较
类
类是变量与作用于这些变量的函数的集合。使用下面的语法定义一个类:
<?php
classCart{
var$items;//购物车中的物品
//将$num个$artnr物品加入购物车
functionadd_item($artnr,$num){
$this->items[$artnr]+=$num;
}
//将$num个$artnr物品从购物车中取出
functionremove_item($artnr,$num){
if($this->items[$artnr]>$num){
$this->items[$artnr]-=$num;
returntrue;
}elseif($this->items[$artnr]==$num){
unset($this->items[$artnr]);
returntrue;
}else{
returnfalse;
}
}
}
?>
上面的例子定义了一个Cart类,这个类由购物车中的商品构成的数组和两个用于从购物车中添加和删除商品的函数组成。
警告
不能将一个类的定义分割到多个文件中。也不能将一个类的定义分割到多个PHP块中,除非该分割是在一个方法声明内部。以下用法将不起作用:
<?php
classtest{
?>
<?php
functiontest(){
print'OK';
}
}
?>
但是以下用法是可以的:
<?php
classtest{
functiontest(){
?>
<?php
print'OK';
}
}
?>
以下警告仅用于PHP4。
小心
名称stdClass已经被Zend使用并保留。不能在PHP代码中定义名为stdClass的类。
小心
函数名__sleep和__wakeup在PHP类中是魔术函数。除非想要与之联系的魔术功能,否则在任何类中都不能以此命名函数。
小心
PHP将所有以__开头的函数名保留为魔术函数。除非想要使用一些见于文档中的魔术功能,否则建议不要在PHP中将函数名以__开头。
在PHP4中,var变量的值只能初始化为常量。用非常量值初始化变量,需要一个初始化函数,该函数在对象被创建时自动被调用。这样一个函数被称之为构造函数(见下面)。
<?php
/*PHP4中不能这样用*/
classCart{
var$todays_date=date("Y-m-d");
var$name=$firstname;
var$owner='Fred'.'Jones';
/*不过包含有常量的数组可以*/
var$items=array("VCR","TV");
}
/*应该这样进行*/
classCart{
var$todays_date;
var$name;
var$owner;
var$items=array("VCR","TV");
functionCart(){
$this->todays_date=date("Y-m-d");
$this->name=$GLOBALS['firstname'];
/*etc...*/
}
}
?>
类也是一种类型,就是说,它们是实际变量的蓝图。必须用new运算符来创建相应类型的变量。
<?php
$cart=newCart;
$cart->add_item("10",1);
$another_cart=newCart;
$another_cart->add_item("0815",3);
?>
上述代码创建了两个Cart类的对象$cart和$another_cart,对象$cart的方法add_item()被调用时,添加了1件10号商品。对于对象$another_cart,3件0815号商品被添加到购物车中。
$cart和$another_cart都有方法add_item(),remove_item()和一个items变量。它们都是明显的函数和变量。可以把它们当作文件系统中的某些类似目录的东西来考虑。在文件系统中,可以拥有两个不同的README.TXT文件,只要不在相同的目录中。正如从为了根目录访问每个文件需要输入该文件的完整的路径名一样,必须指定需要调用的函数的完整名称:在PHP术语中,根目录将是全局名字空间,路径名符号将是->。因而,名称$cart->items和$another_cart->items命名了两个不同的变量。注意变量名为$cart->items,不是$cart->$items,那是因为在PHP中一个变量名只有一个单独的美元符号。
<?php
//正确,只有一个$
$cart->items=array("10"=>1);
//不正确,因为$cart->$items变成了$cart->""
$cart->$items=array("10"=>1);
//正确,但可能不是想要的结果:
//$cart->$myvar变成了$cart->items
$myvar='items';
$cart->$myvar=array("10"=>1);
?>
在定义类的时候,无法得知将使什么名字的对象来访问:在编写Cart类时,并不知道之后对象的名称将会命名为$cart或者$another_cart。因而你不能在类中使用$cart->items。然而为了类定义的内部访问自身的函数和变量,可以使用伪变量$this来达到这个目的。$this变量可以理解为“我自己的”或者“当前对象”。因而'$this->items[$artnr]+=$num'可以理解为“我自己的物品数组的$artnr计数器加$num”或者“在当前对象的物品数组的$artnr计数器加$num”。
注意:伪变量$this通常未定义,如果其所在的方法是被静态调用的话。但这不是个严格规定:如果一个方法被从另一个对象内静态调用的话,则$this会被定义。此时$this的值是那个发出调用的对象。用下例演示:
<?php
classA
{
functionfoo()
{
if(isset($this)){
echo'$thisisdefined(';
echoget_class($this);
echo")\n";
}else{
echo"\$thisisnotdefined.\n";
}
}
}
classB
{
functionbar()
{
A::foo();
}
}
$a=newA();
$a->foo();
A::foo();
$b=newB();
$b->bar();
B::bar();
?>
上例将输出:
$thisisdefined(a)
$thisisnotdefined.
$thisisdefined(b)
$thisisnotdefined.注意:有一些不错的函数用来处理类和对象。应该关注一下类/对象函数。
2. 在php中,子类extends继承了父类,当子类和父类同时存在构造函数__construct先执行哪一个呢
1、如果父类和子类中都没有显式的定义__construct,在实例化子类对象时,只会隐含的调用子类自己的构造方法。
2、如果父类中有显式的构造方法__construct,而子类中没有定义__construct,在实例化子类对象时,就会调用父类中的构造方法。
3、如果父类和子类中都显式的定义了__construct,在实例化子类对象时,只会调用子类自己的构造方法(这就像是子类重构了父类的构造方法),而如果也想要调用父类的构造方法的话,就需要在子类的__construct 方法中显式的调用,(如 __construct(){ parent::_construct();})。
(2)php类继承构造函数扩展阅读
子类的构造函数名与子类名相同。
在子类里父类的构造函数不会自动执行。
要在子类里执行父类的构造函数,必须执行类似以下语句:
$this->[父类的构造函数名()]
类的构造函数统一命名为__construct()。
子类的构造函数名也是__construct()(也是废话)。
在子类里父类的构造函数会不会执行,分两种情况:
1、如子类不定义构造函数 __construct(),则父类的构造函数默认会被继承下来,且会自动执行。
2、如子类定义了构造函数 __construct(),因为构造函数名也是__construct(),所以子类的构造函数实际上是覆盖(override)了父类的构造函数。这时执行的是该子类的构造函数。
这时如果要在子类里执行父类的构造函数,必须执行类似以下语句:parent::__construct();
3. php 子类没有构造函数会调用父类构造函数吗
会调用的,试试下面的代码:
<?php
class f
{
function f()
{echo 'in f';}
}
class z extends f
{
function show()
{echo 'in z';}
}
$z=new z;
$z->show();
?>
4. php中类的构造函数参数问题
其实很多OOP语言都差不多,对于对象的传递是引用,如果你不想对象被引用,那你需要把对象clone一个新对象。 字串与数值的是值传递。
5. Call to a member function assign() on null
thinkphp5 构造前置函数时提示Call to a member function assign() on null
Thinkphp:
在子控制器里面写了一个构造函数,如下
结果页面报错了 ----> Call to a member function assign() on null
然后去继承的父类里面一看,原来里面写了一个_initialize()的方法,原来是子类的构造函数覆盖了父类的,所以报错了,所以需要继承一下父类的构造函数:
6. PHP构造函数传递值的问题
__construct($hostname)里面的参数是构造函数的参数,只能在构造函数内部调用,
public $hostname;这是类的参数,整个类内部包括继承类都可以调用
第二种的参数只能在构造函数中使用,而第一种,则将传来的参数赋值给类的变量,所以第一种的hostname整个类内部的方法都可以使用$this->hostname来调用
7. php 构造函数中的变量不能被其他函数使用吗
test类用extends继承了tools类,如果tools类里面有构造方法的话,test是可以用的。tools的私有成员不能使用,其他都可以。至于构造函数,定义js函数有三种方式,有一种可以叫做构造函数方法定义。至于php中,应该没这说法,在类外面的function叫函数,在类里面见方法或构造方法。
8. PHP子类能否继承父类的构造方法
1. new son 这个类的时候,会先调用 基类 father 的构造函数2.基类构造函数 又调用 init(); 所以输出father3.private 只能限制son 不能直接访问father类 init,但是不能限制 基类调用 自身的private 方法
9. PHP构造函数 在一个类中调用另一类的构造函数怎么会出错
类的实例化不是这样的
Student::__construct("张",24,"男");
改成 new Student("张",24,"男")
10. thinkphp如何使用(调用)构造函数
构造函数不需要调用,你只要实例化这个类,类会自动调用构造函数。
一般用于给类初始化数据。