phpclass类的⽤法详细总结
以下是对php中class类的⽤法进⾏了详细的总结介绍,需要的朋友可以过来参考下
⼀:结构和调⽤(实例化):
class className{} ,调⽤:$obj = new className();当类有构造函数时,还应传⼊参数。如$obj = new className($v,$v2…);
⼆:构造函数和析构函数:
1、构造函数⽤于初始化:使⽤__construct(),可带参数。
2、但析构函数不能带参数(⽤于在销去⼀个类之前执⾏⼀些操作或功能)。析构函数⽤__destruct()做名称。在脚本执⾏结束时,会销掉内存中的对象,因此可不⽤析造函数,但有些⽐如COOKIE等,就应当要⽤此函数销掉。
知识点:在PHP4中也提供了构造函数,但使⽤的是与类同名的类⽅法,在PHP5仍能兼容这种做法,当⼀个类中没有包含__construct时,会查与类同名的⽅法,如果到,就认为是构造函数,如下:
复制代码代码如下:
class test
{ var $b;
function test() { $this->b=5; }
function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9
3、PHP不会⾃动调⽤⽗类的构造函数(不⽀持构造函数重载),必须使⽤parent关键字显式地调⽤。
复制代码代码如下:
class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘这个⼦类的⽗类构造函数调⽤了!';
}
}
当然也可以调⽤与该实例没有任何关系的其它类的构造函数。只需在__construct()前加上类名即可。如:
otherClassName::__construct();
类的主家庭成员:属性、⽅法、常量、静态成员
三、类的属性:
有两种⽅法对类的属性赋值或取值。
1、使⽤公共作⽤域public关键词。
2、使⽤__set()和__get()来分别赋值和取值,前者称为设置⽅法(setter)或修改⽅法(mutator),后者称为访问⽅法(accessor)或获取⽅法(getter)。建议使⽤这种⽅法:优点:
A、可在__set()统⼀进⾏数据验证。
B、便于统⼀管理属性。
注意:
第⼀:__set()和__get()只对私有属性起作⽤,对于⽤public定义的属性,它们两个都懒理搭理,如下:
复制代码代码如下:
class test{
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo “<br />”; echo $a->b;
实例只对$a,$b,$c的设置会经过__set和__get过滤与返回,对于$d,就不会起作⽤。如$a->d=5,再返回还是5。
第⼆:__set($n,$v)要带两个参数。⽽__get($n)只能有⼀个参数。实例:
复制代码代码如下:
class test{
private $a=5,$b=6,$c;
function __set($n,$v)
{
if($n=='a'&&$n>0)
$this->$n = $v;
else
$this->$n = $v+2;
}
function __get($name)
{
return $this->$name; //如果改为return $this->$name + $this->addab(); 如调⽤a的值,实际返回的是a+a+b的值。默认为5+5+6=16。
}
function addab()
{ return $this->a + $this->b; }
}
$e=new test();
$e->a = 11; //注意写法:类的内部⽤$this->$n即变量的写法,但外部实例要⽤$e->a的⽅式。
$e->b = 12; //get 14
$e->k = 22;
类的属性可⾃由扩展,如上例的k,不管是否⽤__set,当⼀个实例建⽴起来后,可以⽤$e->newProperty = xx;直接来创造⼀个属性,但不建议这么做。
四、类的⽅法:
理解成类当中的函数即可。
调⽤:
1、内部调⽤:可使⽤$this->Fanname();或$this->addab()或test::addab();
2、实例化调⽤时,⽤$e->addab();即可。对于在该⽅法中没有使⽤$this关键字的,如上例中的:
function addab() { return $this->a+$this->b; }
改为: function addab() { return 25; }那在在外部实例调⽤该⽅法,也可⽤“$e::addab();”或“test::addab();”
五、类的常量:
如果类的属性理解成类中的变量,那么类的常量和变量是不⼀样的,其定义⽅法为:
复制代码代码如下:
class test{
private $a;
const PI = '3.14′;
…..
//在类中调⽤上⾯的常量⽤两种⽅法,“$this::PI”,或 “类名::PI”,这⾥就是test::PI,如下:
function getvalue(){
return $this->a * $this::PI; //或$this->a * test::PI,⽤this关键字或类名均可,但都要⽤双冒号。
}
}
$e= new test();
exists的用法
$e->PI =5; //注意,这⾥⽤ ->只是创造了⼀个也是名为PI的属性,⽽不是改变类中的PI常量的值。
echo $e::PI; //这个才是调⽤类的常量。
常量只能⽤双冒号::来调⽤。并且不能更改其值。
在类外部实例化后调⽤类常量同样也有两种⽅法。⽅法为:
“$e::PI” 或 “test::PI”,共同点是都要⽤冒号,不同点是外部不能⽤this关键字,只能⽤实例名,但类名::PI是通⽤的。
六、类的静态成员(静态属性或静态⽅法):
如果需要创建供所有类的实例共享的字段或⽅法。就得⽤静态成员。有两个特征:
1、静态成员是共产主义者,它让脚本上的所有该类的实例调⽤,但不能借助类的特定实例名调⽤,⽽是在类的外部,统⼀使⽤“类名::$成员名”的⽅式调⽤。⽽类的内部则统⼀使⽤ “self::$成员名”来调⽤。
2、当每⼀次新创建实例时,静态成员会从上次创建的实例最后值开始重新计算,⽽不是类中初始的值开始计算。
3、对于⽤public定义的静态成员,可以在外部更改它的值。private等则不⾏。
复制代码代码如下:
class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由于public定义的成员,改变静态成员的值。
$c = new test();
echo test::getV(); // 返回 9
七、关键字:
(⼀)this关键字:⽤于类的内部指代类的本⾝。来访问属性或⽅法或常量,如$this->属性名或⽅法名。$this::常量名。this还可以⽤在该类的⼦类中,来指代本⾝的属性或⽅法。
(⼆)双冒号“::”关键字:⽤于调⽤常量、静态成员。
(三)self关键字:在类的内部与双冒号配合调⽤静态成员,如 self::$staticVar.,在类的内部,不能⽤$this来调⽤静态成员。
(四)__toString():在类中使⽤__toString(),⽤于将类转成字串并打印类,⽤处不⼤:如:
复制代码代码如下:
class test{ public $p;
public function __toString(){ return var_export($this,TRUE); }
}
$a=new test();
echo $a; //输出:test::__set_state(array( ‘p' => NULL, )),或写成:echo $a->__toString();
(五)__clone() :当克隆对象时,这个关键字才会发⽣作⽤,⽤于更改克隆时某些值。
(六)__call():⽅法重载,参下⾯⽰例:
复制代码代码如下:
class cB{
function __call($method,$n){
if($method=='showVarType'){
if(is_numeric($n[0])){ //不能⽤$n。要⽤$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h3>这是数字!</h3>';
}
function displayArr() {
echo ‘<h3>这是数组!</h3>';
}
function displayOther() {
echo ‘<h3>不是数组也不是数字!</h3>';
}
}
$x='a';
$y=array(‘a','b');
$b=new cB;
$b->showVarType($x); //不是数组也不是数字
$b->showVarType($y); //这是数组
注意,不能在类中定义showVarType()⽅法,否则代码不能⽤。
(七)extends:继承: 如class a{} class b extends a{} 类b继承了类a
附:记忆:以后统⼀在调⽤⽅法或属性时⽤ “-> “,调⽤常量则⽤双冒号“::”,不会搞晕。
⼋、⽅法和属性的作⽤域:
共有6种:public(默认,可省略,也等同于php6的var声明),private(私有,也不能由⼦类使⽤),protected(私有,但可由⼦类使⽤)
abstract(抽象,参下⽂),final(阻⽌在⼦类中覆盖—也称重载,阻⽌被继承,⽤于修饰类名及⽅法,如final class test{ final function fun(){}},但不能⽤于属性),static(静态)
九:抽象类和抽象⽅法(abstract——注意:没有所谓抽象属性):
抽象可以理解成⽗类为⼦类定义了⼀个模板或基类。作⽤域abstract只在⽗类中声明,但在⼦类中实现。注意事项:
1、抽象类不能被实例化,只能被⼦类(具体类)继承后实现。
2、抽象类必须在其⼦类中实现该抽象类的所有抽象⽅法。否则会出错。
3、在抽象⽅法中,只是声明,但不能具体实现:如abstract function gettow(){ return $this->p; }是错的,只能声明这个⽅法:abstract function gettow();(连⽅括号{}都不要出现),抽象⽅法和抽象类主要⽤于复杂的类层次关系中。该层次关系需要确保每⼀个⼦类都包含并重载了某些特定的⽅法。这也可以通过接⼝实现
4、属性不能被命名为抽象属性,如abstract $p = 5是错的。
5、只有声明为抽象的类可以声明抽象⽅法,但如果⽅法声明为抽象,就不能具体实现。如:
复制代码代码如下:
abstract class Employee
{
abstract function a(…);
abstract function b(…);
}
以后再对这个⽗类扩展,组成各种⼦类(如经理,员⼯,出纳)。
6、抽象类中,如果要实现具体的⽅法,不能声明为抽象。这样可能实际意义更⼤。可以把⼏个类库中共同的部分提取到抽象类中,其它的类继承抽象类即可。如下:
复制代码代码如下:
abstract class BaseShop{
Const TAX=0.06; // 在抽象类中定义常量
public function buy($gid) { // 如果定义为抽象⽅法abstract function buy()就不能在这⾥实现主体。
echo(‘你购买了ID为 :'.$gid.'的商品');
}
public function sell($gid) {
echo(‘你卖了ID为 :'.$gid.'的商品');
}
public function view($gid) {
echo(‘你查看了ID为 :'.$gid.'的商品');
}
}
class BallShop extends BaseShop{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}
public function open()
{
$this->sell($this->itme_id);
}
public function getTax()
{
echo printf(‘<h3>平均税率是 %d%%。</h3>',$this::TAX*100);
}
}
$s = new BallShop;
$s->open(); //你卖了ID为 :2314的商品
$shop->getTax();
⼗:类型提⽰:
注意,类型提⽰功能只能⽤于参数为对象的提⽰,⽽⽆法⽤于为整数,字串,浮点等类型提⽰。有些类的⽅法需要传⼊的参数为所期望的对象类型,可以⽤下⾯的⽅法达到强制实施此替则。要达到类型提⽰,只要在⽅法的对象型参数前加⼀个已存在的类的名称,如:function funname(OtherClassName $otherclassINSName,$c….),注意,OtherClassName必须是存在的类。如下:
复制代码代码如下:
class em{ var $k=56; }
class test{
function __construct()
{ echo $this->addab(new em(),2); }
function addab(em $j,$c) //这个⽅法,即可以在内部调⽤,也可以在外部调⽤。只要作⽤域许可。
{ return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2); //或 $a->addab(new em(),2);
⼗⼀、类的管理:
1、instanceof关键字:⽤于分析⼀个对象是否是某⼀个类的实例或⼦类或是实现了某个特定的接⼝:如下例,但要注意:类名没有任何引号等定界符,否则会出错。如test不能⽤'test'
复制代码代码如下:
class test2{}
class test{}
class testChilern Extends test{}
$a = new test2();
$m = new test();
$i = ($m instanceof test);
if($i)echo ‘$m是类test的实例!<br />'; // get this value
switch ($a instanceof test){
case true :
echo ‘YES<br />';
break;
case false :
echo ‘No<br />'; //get this value
break;
}
$d=new testChilern();
if($d instanceof test)echo ‘$d是类test的⼦类!<br />'; // get this value
2、确定类是否存在:boolean class_exists(string class_name): class_exists(‘test');

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。