我看到了
行String geoUri = "geo:" + latitude + "," + longitude;
NdefRecord geoUriRecord = NdefRecord.createUri(geoUri);
在CakePHP 3.x和所有3.x文档中的所有预加载方法中。
删除该行,或者忘记将行添加到新方法中,似乎没有任何负面影响。
这引出了一个问题,它做了什么?
道歉这是一个完全没有问题的问题..
答案 0 :(得分:3)
It is simple OOP.它调用同名的父方法。
Aclass {
public function foo() { echo 'bar'; };
}
Bclass extends Aclass {
public function foo() { parent::foo(); echo 'foobar'; }
}
只需尝试并删除父电话,您就会看到它的作用。通常应调用父项,尤其是在initialize()回调等方法中。但是,何时打电话或不打电话是他们必须作出的决定。这取决于您是否需要或不需要调用父方法逻辑。这称为“重载”。
这允许您在方法的父调用之前或之后添加功能,这是非常常见的事情。我建议您使用php手册的read the OOP chapter。
答案 1 :(得分:1)
在Controller的initialize()
方法中,您可以定义要加载的任何组件,以及任何组件
他们的配置数据:
public function initialize()
{
parent::initialize();
$this->loadComponent('Security');
$this->loadComponent('Paginator');
$this->loadComponent('RequestHandler');
}
答案 2 :(得分:1)
这正是它所说的从父类运行方法。所以例如。
class AppController extends Controller {
public function initialize() {
echo 'hello world';
// do more sh*t
}
}
class UsersController extends AppController {
public function initialize() {
parent::initialize(); // this will run the method initialize from app controller that will echo 'hello world'
// do more sh*t
}
}
答案 3 :(得分:1)
删除它时没有做任何事情,因为父初始化函数内部没有任何内容,但它只是为了防止你想要从父控制器扩展功能到儿童控制器。例如:
在AppController中有一个beforeFilter函数,用于定义在页面加载之前我想要运行的内容。让我们说我希望在每个页面上运行一个函数 - 如果用户没有登录就是一个简单的重定向函数:
if (!$this->Auth->user()) {
$this->redirect('Users/login');
}
我可以将它放在appController的beforeFilter中,而不是将它放在每个控制器上的beforeFilter中。我可以将它放在AppController的beforeFilter中。
我的其他控制器,如UsersController,从AppController扩展:
class UsersController extends AppController {
所以在我的 UsersController 中的beforeFilter中,我可以这样做:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
现在我从父控制器(AppController)继承了这个重定向行为,以便相同的代码也在我的子控制器(UsersController)中运行 - 并且无论用户去哪个控制器,它们都被重定向到登录页面,如果他们没有登录。
这与parent :: initialize()的工作方式相同;您继承了父控制器中initialize函数内部存在的功能。这只是用于消除冗余代码的功能。
所以基本上,如果你看到你在每个页面上使用的代码,找到一种方法,通过删除它并将其放在代码可以继承的文件中,使其有点面向对象。它同样可以将页眉和页脚代码移出HTML文档并将它们放在自己的php文件中,这样您就可以在一个区域中进行更改并更新所有受影响的衍生物,而不是编辑标题和每个HTML文档中的页脚。