在PHP中,可以使用class关键字具有用户定义的compund数据类型。类的新实例是一个对象。对象的特性按照类的定义,可以包含属性,常量和方法成员。
类成员的可访问性(也称为可见性)取决于其定义中附加的可见性前缀关键字。PHP具有三个可见性关键字-public,private和protected。任何地方都可以访问用public关键字声明的类成员。受保护的成员可以从其类内部或通过继承类进行访问。另一方面,私有成员只能由定义了私有成员的同一个类访问,并且外部的任何成员都不可见。
属性是类实例的属性。它可以是实例属性(每个对象具有不同的值)或类属性,每个对象具有相同的值。属性可以是任何有效的PHP数据类型。默认情况下,属性具有公共可见性。如果使用var关键字定义了属性(现已弃用),则将其视为public。
<?php class myclass{ public $fname="Ajay"; var $lname; //treated as public private $marks=100; protected $age=20; } $obj=new myclass(); echo "$obj->fname\n"; $obj->lname="Diwan"; echo "$obj->marks\n"; $obj->age=21; ?>
输出结果
以下输出显示可以在类外访问公共属性,而私有属性和受保护的属性则会引发未捕获的错误
Ajay PHP Fatal error: Uncaught Error: Cannot access private property myclass::$marks PHP Fatal error: Uncaught Error: Cannot access protected property myclass::$age
但是,可以在同一类的函数内部使用私有和受保护的属性
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->displaydata(); ?>
输出结果
这将产生以下结果。-
Ajay Diwan marks=100 age=20
像类属性一样,还可以使用公共,私有和受保护的关键字为类方法分配可见性。默认情况下,方法也被视为公共方法。
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; public function setname(){ $this->fname="Anil"; $this->lname="Dave"; echo "name changed\n"; } private function setmarks(){ $this->marks=90; } protected function setage(){ $this->age=21; } function setdata(){ $this->setname(); $this->setmarks(); $this->setage(); } function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->setname();//works $obj->setmarks();//error $obj->setage();/error $obj->setdata(); //private and protected methods called withing public method $obj->displaydata(); ?>
输出结果
这将产生以下结果。-
name changed PHP Fatal error: Uncaught Error: Call to private method myclass::setmarks() from context '' PHP Fatal error: Uncaught Error: Call to protected method myclass::setage() from context '' Anil Dave marks=90 age=21
父类方法可以在子类定义中覆盖。父类的私有方法和受保护方法不适用于子类的对象。但是,可以在子类方法中使用在父级中受保护的方法
<?php class testclass{ public $x=10; private $y=20; protected $z=30; private function test(){ echo "testclass private method\n"; } public function test1(){ echo "testclass public method\n"; } protected function test2(){ echo "testclass protected method\n"; } function test3(){ echo "x=$this->x y=$this->y z=$this->z\n"; } } class newclass extends testclass{ function test1(){ echo "newclass public method\n"; } public function test4(){ $this->test(); $this->test1(); $this->test2(); } } $obj=new newclass(); echo $obj->test1(); echo $obj->test3(); echo $obj->test4(); ?>
输出结果
这将显示以下结果
newclass public method x=10 y=20 z=30 PHP Fatal error: Uncaught Error: Call to private method testclass::test() from context 'newclass'
从PHP 7.1开始,可见性模式可以与constaants一起使用。常量的默认可见性是public
<?php class testclass{ public const X=10; private const Y=20; protected const Z=30; function showconst(){ echo "x=" . self::X ; echo "y=" . self::Y; echo "z=" . self::Z ; } } $obj=new testclass(); $obj->showconst(); echo testclass::Y . "\n"; echo testclass::Z . "\n"; ?>
输出结果
这将显示以下结果
x=10y=20z=30 PHP Fatal error: Uncaught Error: Cannot access private const testclass::Y PHP Fatal error: Uncaught Error: Cannot access protected const testclass::Z