【问题标题】:How can I mention keyword arguments in php constructor?如何在 php 构造函数中提及关键字参数?
【发布时间】:2014-03-02 04:23:05
【问题描述】:

我是PHP OOP 的新手。

我有这个构造函数

protected $path='default';  

function __construct($var1, $var2 ..){
        $this->var1=$var1;
        $this->var2=$var2;
    }

$obj = MyClass($var1='www')

我希望如果我创建对象并且不传递任何参数,那么我会得到具有空值的对象。

但是如果在构造函数中提到上面的属性,那么对象应该设置这些属性。

目前,如果我用 args 定义构造函数并且不提供任何参数,那么我会收到错误 .

【问题讨论】:

  • 这是什么类?它应该怎么做?

标签: php


【解决方案1】:

你可以在 PHP 中使用func_get_args()

<?php
class foo
{

    private $arrParams;

    function __construct()
    {
        if (func_num_args() != 0) {
            $this->arrParams = $this->setValues(func_get_args());

        }
    }

    public function setValues($params)
    {
        return $params;
    }

    public function dispParams()
    {
        print_r($this->arrParams);
    }

    public function retVal($var)
    {
        return $this->arrParams[$var];
    }

}

$foo1 = new Foo(3, 45, 64, 34);
$foo1->dispParams();

OUTPUT :

Array
(
    [0] => 3
    [1] => 45
    [2] => 64
    [3] => 34
)

为了从数组中获取对应的值...你可以调用

 $foo1->retVal(2); // Prints you 64

【讨论】:

  • 如果我在 Foo 中有 $a, $b , $c 之类的属性。我希望所有这些都可以正常工作。 Foo($a='33'), Foo($b='dsds') , Foo($c='wqwq', $b='22') and Foo() 没有错误,并且具有构造函数中定义的属性设置
  • 如果你要传递 10 到 15 个参数,那将变得更加复杂,并且你将拥有像 $a,$b,$c,$d,$d..... 这样的变量继续......这不好。就像我做的那样,即创建一个私有数组变量,然后使用 func_get_args() 映射值
  • 所以这意味着我必须从构造函数中获取参数,然后在 object 的 porperties 中手动设置这些参数。我在想如果没有手动设置它是否可能。 $this-&gt;$key = $value;
  • 是的,func_get_args() 你不需要这样做。你传递的所有参数都直接压入数组中。
  • 但我需要一些函数来在类的属性上设置它们。像这样stackoverflow.com/a/14937691/3147180
【解决方案2】:

你需要像这样声明类属性:

class  yourClass{

protected $path='default';  
public $var1;
public $var2;
function __construct($var1="dd", $var2='ss'){
        $this->var1=$var1;
        $this->var2=$var2;
    }

}

$obj = new yourClass();
echo "without params: ".$obj->var1.$obj->var2;

$obj2 = new yourClass("sdf","sfdsdf");
echo " with params : ".$obj2->var1.$obj2->var2;

Demo

【讨论】:

  • @user3147180:你试过这个吗?
  • 我想我想要的只是我在构造函数中传递大量的关键字参数,构造函数应该将其设置为类的属性
猜你喜欢
  • 2018-04-26
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多