发新话题
打印

[原创]Delphi for PHP的感受和心得

本主题由 flyindance 于 2008-2-28 18:16 加入精华

[原创]Delphi for PHP的感受和心得

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 编辑 ]
Borland forever!

TOP

嗯,不错,支持原创。

TOP

例子很简单,但却很实用,楼主有心了。
一個偽裝成白癡的天纔!

TOP

希望楼主继续,最好是写一个系列教程

TOP

发新话题