PHP全局变量范围使用最佳实践

时间:2017-11-06 16:48:49

标签: php variables scope

我是编程新手,对函数内全局变量的使用有一些怀疑。

我试图将逻辑与我的html表单的结构分开,这就是我的问题源于此。

我声明为全局的变量只能在函数外部的一个特定位置使用,即html表单。

function updatePosts(){
     $query= "...";
     $result= "...";
     $rows= mysqli_fetch_assoc($result);
     global $post_title;
     $post_title = $rows['post_title'] ;
}

updatePosts();

<form action="">
//use of global variable outside function
    <input type="text" name="" value="{$post_title}" class="form-control">
</form>

当我声明多个全局变量时,它提出了一些关于这么多全局变量可能产生什么影响的问题。例如

function updatePosts(){
     $query= "...";
     $result= "...";
     $rows= mysqli_fetch_assoc($result);
     global $post_title;
     global $post_author;
     global $post_content;
     global $post_tags;
     global $post_image;
     global $post_status;
     global $post_date;
     $post_title = $rows['post_title'] ;
     $post_author = $rows['post_author'] ;
     $post_content = $rows['post_content'] ;
     $post_tags = $rows['post_tags'] ;
     $post_image = $rows['post_image'] ;
     $post_status = $rows['status'] ;
     //and so on..
}

updatePosts();

<form action="">
<input type="text" name="" value="<?php echo $post_title ?>" class="form-control">
<input type="text" name="" value="<?php echo $post_author ?>" class="form-control">
<input type="text" name="" value="<?php echo $post_tags ?>" class="form-control">
<input type="text" name="" value="<?php echo $post_content ?>" class="form-control">
<input type="text" name="" value="<?php echo $post_status ?>" class="form-control">
//and so on...
</form>

这被认为是函数和全局变量的可接受用法吗?

如果没有,那么将逻辑与结构分开的可能是更有效的方法。而不是封装在一个函数中,包括更适合这个任务吗?

任何建议都会非常感激,并且在帮助初学者进行编程/ php之旅方面会有很长的路要走。

1 个答案:

答案 0 :(得分:0)

我个人会使用 Closures 来获取范围中的变量以供进一步使用,是的,关键字global是不好的做法,在旧版本中,它在程序编码中更有用但今天你只需要构建微小的闭包以便快速使用。

只是为了给你一个大致的想法。

$variable_from_outside = "hi!";
$closure = function() use ($variable_from_outside) {
    // do stuff with that variable inside this scope..
};

Closure Documentation

但是,您也可以将函数内部的变量作为参数

$variable = 'something';
function func($variable) {
    // do stuff with $variable
}

在OOP中,最好的方法是 Traits 。无论您的愿望是什么,都可以在类中声明通用属性或方法以及use。当你在后来的派生类中获取特征时,它也会降低性能,例如,它们不必一直在整个API中携带。

trait Example {
    public $stuff = 'Yey!';
    // or methods...
}

class someClass {
    use Example;
    function __construct() {
        echo $this->stuff; // Yey!
        // etc...
    }
}

Trait Documentation