【问题标题】:PHP function categories in classes / Cases in parameters类中的PHP函数类别/参数中的案例
【发布时间】:2015-04-18 21:06:25
【问题描述】:

我要修改这段代码

function send($message, $mode, $param1, $param2)
{
    $msg = ">> " . $message;

    if ($mode == "client") {
        $client = $param1; // $param1 is a websocket source variable
        // code
    }
    elseif ($mode == "clients") {
        $clients = $param1; // now $param1 is an array of websocket sources
        // code
    }
    elseif ($mode == "all") {
        // code
    }
}

send("Hello World!", "all", $whatever1, $whatever2);

(这个函数实际上是读取 $mode 来理解它要做什么)

下面的代码。 此代码将不起作用。我想告诉我我必须做哪些改变才能让它工作

class send($message)
{
    $msg = ">> " . $message;

    public function client($client, $param2) { // $client is $param1 of previous code
        // code using $msg
    }

    public function clients($clients, $param2) { // $clients is an array and the $param1 of previous code
        // code using $msg
    }

    public function all($param2) {
        // code using $msg
    }
}

send("Hello World!")::all($whatever2);

我知道第二个代码非常混乱。它不起作用,但我想做这样的事情。对函数和参数进行分类。我希望你明白了。也许没有这样的方法,我必须在第一个代码中使用 $mode 方法?

【问题讨论】:

    标签: php class parameters


    【解决方案1】:

    您正在尝试分解函数并从各个部分创建一个类。

    您的代码中有一些语法错误。 您在这里混淆了很多概念:函数、类、静态和动态调用。请阅读 PHP 手册中关于 OOP 的基本章节:http://php.net/manual/en/language.oop5.php


    这部分是错误的。

    class send($message)
    {
    

    类定义以关键字class开头,后跟类名:

    class Send {
    
    }
    

    你不能直接在类中使用 this,你可以将它包装在构造函数或函数中。

    $msg = ">> " . $message;
    

    你可以声明一个接受参数的构造函数:

    public function __construct($message) {
        $this->message = $message;
    }
    

    class Send
    {        
        private $message = '';
    
        public function __construct($message) {
            $this->message = $message;
        }
    
        public function toClient($client, $param) {
            var_dump($this->message, $client, $param);
        }
    
        public function toClients($clients, $param) {
            var_dump($this->message, $clients, $param);
        }
    
        public function toAll($param) {
            var_dump($this->message, $param);
        }
    }
    

    该类接受构造函数中的消息并将其设置为属性。 然后,您可以在函数中重用它($this->message)。


    // Usage
    
    $message = 'Hello World';
    
    // instantiate the class
    // and pass the message you want to send as param
    // execute a specific class method 
    
    $send = new Send($message);
    $send->toClient('john', 'more');
    
    // with PHP 5.4 it's a one-liner
    (new Send($message))->toClient('john', 'more');
    

    【讨论】:

    • 非常非常好。但是因为我不想用 2 行来调用它,我该怎么做才能在一行中运行它?比如 Send("message")::toClient('john', 'more')
    • 很高兴我能帮上忙。请忘记范围解析运算符 (::)。使用静力学很容易陷入糟糕的设计。您正在寻找的内容称为“方法链接”或“菊花链接”。例如,请参见此处:stackoverflow.com/questions/12853573/… & stackoverflow.com/questions/2188629/… 您只需在方法结束时返回对象 (return $this;)。换句话说:类的方法返回对象本身,这允许以下调用另一个方法。
    • 如果您使用的是 PHP 5.4+,那么您可以使用单线来实例化类并调用类方法。更新了我的答案(见最后一行)。
    【解决方案2】:

    我想通了,非常感谢 Jens A. Koch

    为所有在场的人:

    PHP 5.4 之前的版本:

    class send {
        public function __construct($msg) {
            $this -> message = $msg;
        }
        public function clients(/* many params */) {
            echo "some clients say: ".$this->message;
        }
        public function client(/* many params */) {
            echo "one client says: ".$this->message;
        }
        public function all(/* many params */) {
            echo "all clients say: ".$this->message;
        }
        // function b (build) returns the class
        public function b($msg) {return new self($msg);}
    }
    
    // CALLING IT
    send::b("test")->clients(); // >> some clients say: test
    

    PHP 5.4+(不幸的是我有 5.3 但它应该可以工作) 不需要“公共函数 b”:

    class send {
        public function __construct($msg) {
            $this -> message = $msg;
        }
        public function clients(/* many params */) {
            echo "some clients say: ".$this->message;
        }
        public function client(/* many params */) {
            echo "one client says: ".$this->message;
        }
        public function all(/* many params */) {
            echo "all clients say: ".$this->message;
        }
    }
    // CALLING IT
    (new send("test"))->clients();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多