VCL是
Delphi的核心,同样VCL
for PHP(V4P)也是Delphi for PHP(D4P)的重中之重。因为D4P是面向
组件和以前的PHP开发有很大差别,搞清V4P是很重要的。可以这么说D4P = IDE + V4P
小弟也是刚刚才开始学习D4P,在此写下自己的一些心得大家分享和讨论,有什么错误之处还望指正。
我们先来看一个例子:
sample_1.php
复制内容到剪贴板
代码:
<?php
//Includes
require_once("vcl/vcl.inc.php");
use_unit("forms.inc.php");
use_unit("extctrls.inc.php");
use_unit("stdctrls.inc.php");
//Class definition
class Hello extends Page
{
public $Label1 = null;
function HelloShow($sender, $params)
{
[color=Red]$this->Label1->Caption = "Hello world";[/color]
}
}
global $application;
global $Hello;
//Creates the form
$Hello=new Hello($application);
//Read from resource file
$Hello->loadResource(__FILE__);
//Shows the form
$Hello->show();
?>上面这段除了红字部分,全是IDE自己生成的,用过D4P的应该很好理解这段是什么意思。为什么Label会按我们设计时的样式来显示?为什么Page在show()的时候会自动调用HelloShow()方法?所有的这些,就是$Hello->loadResource(__FILE__);所做的。可能大家已经发现,在工程目录下还有个和你的Unit对应的Unit.xml.php,这个就是资源
文件。打开看就是个
XML文件而以,里面保存了你在IDE里设计控件的属性内容。而loadResource就是把这些读出来,并赋给每个控件。也就是说每次打开用D4P写的
页面,PHP都要读这些资源信息。。。所以慢是正常的。
这就是组件的实现方法,下来再来一个例子,这段代码是我用别的编辑器写的。sample_2.php和sample_1.php的功能是一样的,只要VCL_ROOT_PATH定义正确,不用DBG也可以正常运行,代码分析:
sample_2.php
复制内容到剪贴板
代码:
<?php
require_once(VCL_ROOT_PATH . '/vcl.inc.php');
use_unit('forms.inc.php');
use_unit('stdctrls.inc.php');
class Hello extends Page
{
public $label = null;
public function _onloaded($sender, $param)
{
// 生成一个Label(标签)实例,并设置它的Caption(标题)属性
$this->label = new Label($this);
$this->label->Caption = "Hello world";
// 设置实例的parent属性,这样在它的parent->show()中的dumpChildren()可以将Control所有children也显示出来
// 特别要注意的是Control的__construct只是继承了Component的__construct($owner),并没有在构造时将parent设为$owner,也就是说一个Control的包含者不一定就是它的owner,虽然很多情况下是这样
$this->label->parent = $this;
}
}
global $application;
global $hello;
// 生成Hello实例
$hello = new Hello($application);
// 设置OnCreate事件方法
$hello->OnCreate = "_onloaded";
// 加载Page
$hello->loaded();
// 显示Page
$hello->show();
?>为了说明问题,我并没有设置Page和Label的Name和样式属性。否则就要多写很多代码,D4P正是用资源文件来隐藏这些细节内容,而用IDE框框点点就可以完成组件的样式和其它一些属性的设置。
说完组件构成,下来说说事件的驱动。回过头再看看 $hello->; 这句,OnCreate是一个事件句柄属性,它设置了事件方法的入口函数,而所有入口函数的接口都是一样的:fn($sender, $param)
其中$sender是事件发起者,$param是一个Array(),指事件的参数。对于上面的代码来说$hello实例调用的方法都有:
1. Hello::__construct [$hello = new Hello($application);]
2. Hello::_onloaded [$hello->loaded();]
3. Hello::OnShow [$hello->show();] 这个事件并没有给句柄,所以没有任何函数调用
以上为了说明D4P里组件的构成和事件驱动的方式,晚了下次再写吧
PS:
phpres的code标签不管用?还是我不会用?
[
本帖最后由 flyindance 于 2008-2-28 18:18 编辑 ]