关于类protected、private、public的方法

今天在写代码的时候发现了一种情况,(TP框架)有一个model类   AdminModel.class.php

class AdminModel extends Model
{
protected $_validate = array(
array('username','require','管理员名称不得为空!',1),
//array('username','','管理员 名称已经存在!',1,'unique',1),

array('password','require','管理员密码不得为空!',1,'regex',1),
);

public function login()
{
$password = $this->password;
$info = $this->where(array('username'=>$this->username))->getField('password');

if ($info == md5($password)){
return 1;
}else
return 0;
}

}

<?php
namespace AdminController;

use ThinkController;

class LoginController extends Controller
{
public function index()
{
$admin = D('admin');    //实例化AdminModel
if (IS_POST){
if ($admin->create()){
if ($admin->login()){  //使用AdminModel里的login方法
$this->success('登陆成功,跳转中……',U('Index/index'));
}else{
$this->error('用户名或密码错误');
}
}else{
$this->error($admin->getError());
}
exit();
}

$this->display();
}
}

但是奇怪的是,当将login方法 属性设置为protected的时候,控制器中的$admin对象无法调用login()方法,上网搜索了一下,得到的答案如下。
原文地址:http://www.educity.cn/wenda/712078.html

一般规则如下: 
公有继承时,水平访问和垂直访问对基类中的公有成员不受限制; 
私有继承时,水平访问和垂直访问对基类中的公有成员也不能访问; 
保护继承时,对于垂直访问同于公有继承,对于水平访问同于私有继承。

规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问

原文地址:https://www.cnblogs.com/zhouqi666/p/6189709.html