PHP中面向对象编程之封装以及魔术方法的使用

/*面向对象编程之方法的封装:
  1.类中定义的方法如果加上private修饰词封装后就不能被外部对象直接访问,但是可以被这个对象中未封装的
  其他成员属性和方法使用;
  2.一般类中有很多方法是为了类中某一个特定的某个方法服务的并且也不希望外部对象直接访问到,所以就需要
  将那些不需要外部了解的方法加以封装;
  3.构造方法和析构方法不需要加以封装,因为是公开的;
  4.封装后的方法不能通过外部直接访问:类似手机功能只提供让用户交互的接口,其他的功能模块都是封装好的;
  5.魔术方法:__set()和__get()方法
__set()方法:当外部设置私有属性值的时候自动调用;
__get()方法:当外部读取私有属性值的时候自动调用;
通过魔术方法控制私有属性值的读取和设置;
  6.魔术方法:__isset()和__unset()方法
    对象中受保护的和私有的属性无法通过isset和unset来判断是否存在和删除属性值,所以需要完成此功能需要在
类中提前声明魔术方法来自动调用间接的控制从来达到和isset和unset同样的功能(在对象外部使用isset()和unset()时
会自动调用这两个对应的魔术方法)
  
*/

class demo{
private $name;
private $age;
private $sex;
function __construct($name,$age,$sex){
$this->name=$name;
$this->age=$age;
$this->sex=$sex;
}
function say(){
echo "我的名字叫{$this->name},年龄是{$this->age},性别是{$this->sex}.
";
}

function __get($pro){
echo "$pro,@@@@@@@@@@@@@@";
return $this->$pro;
}

function __set($name,$value){
if($name=="age"){
if($value<18||$value>48){
return $this->$name=22;
}
}
$this->$name=$value;
}
function __isset($proname){
if($proname=="age"){
echo "$$$$$$$$$
";
return true;
}
else{
echo "@@@@@@@@@@@
";
return false;
}
}
function __unset($proname){
if($proname="age"){
echo "无法删除此成员属性";
return false;
}
else{
return true;
}
}
/*
function setsex($sex){
if($sex=="男"||$sex=="女"){
$this->sex=$sex;
}
else{
$this->sex="保密";
}
}
*/
function run(){
$this->left();
$this->left();
$this->right();
$this->right();
$this->go();
$this->go();
$this->go();
}
private function left(){
echo "left, ";
}
private function right(){
echo "right, ";
}
private function go(){
echo "go, ";
}
function __destruct(){
echo "再见,demo!";
}
}
$obj=new demo("刘仁","18","男");
/*public修饰的成员属性,可以在对象外部人为的改变和读取属性的值;
$obj->setsex("女");
private修饰的成员属性,不可以在对象外部改变或直接读取属性的值,但可以通过对象中其他方法间接读取或设置控制

$obj->say();
echo $obj->name."
";
echo $obj->age."
";
echo $obj->sex."
";

$obj->name='许三多';
$obj->age=58;
$obj->sex='保密';
$obj->say();
*/
unset($obj->age);
if(isset($obj->age)){
echo "这个成员属性存在!";
}
else{
echo "这个成员属性不存在!";
}
?>

你可能感兴趣的:(小程序,PHP地基)