0

我有一个关于函数声明的问题。我想要类似的东西:

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 ?其实在这种情况下我没有输入提示,对于对象,我需要指定一个类或接口,有时我接受许多对象来调用 __toString() 魔术类,然后我接受所有对象。

4

2 回答 2

1

我不太明白你的问题

像PASSWORD_DEFAULT这样的常量,但只是它(没有带双的函数名:)。

但我的猜测是,您正在寻找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

于 2019-05-02T14:57:35.010 回答
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

所以你的另一个问题是你是否可以将常量作为函数的属性传递:

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

如果您在同一个类中,则不必在同一类的任何函数中使用该值,而无需将其传递给类/作用域的全局:

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'];


}
于 2019-05-02T14:52:31.710 回答