visibility برای یک ویژگی یا متد توسط پیشوند اعلامی کلمات کلیدی زیر مشخص میشود: public٬ protected یا private. Public موارد را دسترسی عمومی میدهد. Protected دسترسی به کلاسهای والد و به ارث برده محدود میکند (و کلاس تعریف کننده مورد). Private دسترسی را به کلاس تعریف کننده محدود میسازد.
اعضای کلاس باید با public٬ private٬ یا protected تعریف شود. اگر با استفاده از var بدون کلمه visibility تعریف شوند ویژگی public خواهد بود.
Example #1 اعلام متد
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// We can redeclare the public and protected method, but not private
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined
?>
Note: متد PHP 4 برای اعلام یک متغیر با کلمه کلیدی var هنوز برای تطبیق پشتیبانی میشود (به عنوان هم معنی کلمه public). در PHP 5 پیش از 5.1.3 استفاده آن یک هشدار E_STRICT ایجاد مینمود.
متدهای کلاس باید با public٬ private٬ یا protected تعریف شود. متدهای بدون اعلام بصورت public در نظر گرفته میشوند.
Example #2 اعلام متد
<?php
/**
* Define MyClass
*/
class MyClass
{
// Declare a public constructor
public function __construct() { }
// Declare a public method
public function MyPublic() { }
// Declare a protected method
protected function MyProtected() { }
// Declare a private method
private function MyPrivate() { }
// This is public
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Works
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Public, Protected and Private work
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// This is public
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Fatal Error
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Works
$myclass2->Foo2(); // Public and Protected work, not Private
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>