使用常量作为函数属性

时间:2019-05-02 14:20:57

标签: php php-7 php-7.3

我对函数声明有疑问。我想要类似的东西:

password_hash('er', PASSWORD_ARGON2I);

https://www.php.net/manual/en/function.password-hash.php

创建函数时,我想声明一些可能性,例如:

  • PASSWORD_DEFAULT = 1
  • PASSWORD_BCRYPT = 2
  • PASSWORD_ARGON2I = 3
  • PASSWORD_ARGON2ID = 4

然后,当用户使用该功能时,他只需设置常数的值即可。

实际上我是这样做的:

$instanceOfMyClass->myFunction('er', MyClass::A_CONSTANT);

它完成了工作,但是在使用常量名称之前,我不得不写类名称。然后,如果我愿意,我就可以访问该类的所有常量。

我认为,我在函数级别谈论诸如常量之类的东西。

非常感谢:-)

PS:有没有办法为函数属性做一个像int | object | string这样的DeclarationType?实际上,在这种情况下,我不键入提示,对于对象,我需要指定一个类或接口,有时,我接受许多对象来调用__toString()魔术类,然后接受所有对象。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到。

已定义的常量不能修改,但是如果满足条件,可以对其进行分析和验证;尽管这个正在做所有的事情;因为对于不可变/不可变的东西将是双重工作

<?php
class Main{
    const CONSTANT = 'value constant';
    function ouputConts() {
        echo  var_dump(self::CONSTANT);
    }
}

在您的情况下;我可以保持不变:

<?php
class Main{
    const CONSTANT1 = 1; //integer
    const CONSTANT2 = 0.1345; //float
    const CONSTANT3 = 'text'; //string
    const CONSTANT4 = array(1,2,3,4,5,10,20); //array
    const CONSTANT5 = true; //bollean
    function ouputConts() {
        echo var_dump(self::CONSTANT1);
        echo var_dump(self::CONSTANT2);
        echo var_dump(self::CONSTANT3);
        echo var_dump(self::CONSTANT4);
        echo var_dump(self::CONSTANT5);
    }
}

因为在php中一个对象或任何类型的对象都被认为是可变的;您不能声明类型对象的常量。

文档: https://php.net/manual/en/language.constants.syntax.php https://www.php.net/manual/en/language.oop5.constants.php

因此,您的另一个问题是,是否可以将常量作为函数的属性传递:

是的,但是您应该注意一些事项:

如果您位于同一类中,则不必在同一类的任何函数中使用该值,而无需为该类/范围将其传递给Global:

class Main{
    const CONSTANT = 'value constant';
    function function1() {
        $this->function2();
    }
    function function2() {
        $this->function3();
    }
    function function3() {
        $this->function4();
    }
    function function4() {
        echo  var_dump(self::CONSTANT);
    }
}

如果该函数属于另一个类,我建议您首先将其存储在变量中...:

class Main1{
    const CONSTANT = 'value constant';
    function function1() {
        $foo = CONSTANT;
        Main2::FunctionTest($foo);
    }
}
class Main2{
    function FunctionTest($foo = '') {
       echo  var_dump($foo);
    }
}
// I can not verify it.

希望我对您的问题有所帮助;如果您需要更多帮助或加深查询,请给我评论。

更新;我看到了这个commnet:

  

@ChristophBurschka通过这样做,您在使用该功能时不会   帮助检索特定的常量(并非所有类常量   可用于此功能)。使用本机PHP函数时,   只是有可能使用可用的常量,而IDE具有   查找它们的能力(并在出现以下情况时自动将其列出给您)   您开始填写相应的参数)?感谢您的回答   关于类型提示:-)

如果问题出在您的const的范围内:

您可以在应用程序中声明全局常量(在所有类和函数中):

<?php
if (!defined('DB_PASS')) {
    define('DB_PASS', 'yourpassword');
}

它将在整个应用程序的任何类和功能中可用。并且它们的使用是不可变的,因此不用担心。

更新恢复和实施

使用我最后解释的方法,您可以进行比较并定义要使用的数据;常量的数据还是用户发送的数据;但所有这些都必须与您定义的特定功能中对用户数据的分析相关联。

最新更新

使用新定义,您可以:

<?php
//declaration:
if (!defined('PASS_SIS')) {
    define('PASS_SIS', array(
            'PASSWORD_DEFAULT' => 1,
            'PASSWORD_BCRYPT' => 2,
            'PASSWORD_ARGON2I' => 3,
            'PASSWORD_ARGON2ID' => 4,
    ));
}

//call Function
$instanceOfMyClass->myFunction('er');

//function 
function myFunction('er'){
    echo var_dump(PASS_SIS);
    //Access to data:
    echo PASS_SIS['PASSWORD_DEFAULT'];


}

答案 1 :(得分:1)

我不太了解您的问题

  

常量类似于PASSWORD_DEFAULT,但仅此而已(没有带double的函数名:)。

但是我的猜测是,您正在寻找define()

我建议您尽可能地利用OOP,因此像其他人所说的那样,使用类常量。但是,如果出于任何原因想要全局常量,它都会像这样:

define('DIRECTION_FORWARD', 0);
define('DIRECTION_LEFT', 1);
define('DIRECTION_RIGHT', 2);

function goInDirection($direction = DIRECTION_FORWARD)
{
    // ....
}

您可以使用位掩码,而不是仅使用序列号作为值,它可以与按位运算符和2的幂一起使用。

https://www.php.net/manual/en/language.operators.bitwise.php