【问题标题】:Access private static class property from Ajax从 Ajax 访问私有静态类属性
【发布时间】:2013-11-06 23:14:55
【问题描述】:

我有一个类似的课程:

class My_Class {
    private static $array = null;
    private static $another_array = null;

    private function __construct() {
        self:$another_array = array( 'data' );
    }

    // This gets executed from jQuery Ajax when user clicks a button
    public static function process_ajax() {
        self::generate_html();
    }

    private static function generate_html() {
        if ( ! self::$array ) {
            self::$array = array( 'some data' );
        }
    }

    // This gets executed when user is trying to save Ajax generated form
    public static function save_ajax_form() {
        print_r( self::$another_array ); // prints [0] => 'data'
        self::validate_data();
    }

    private static function validate_data() {
        // WHY DOES THIS EVALUATE TRUE? 
        if ( ! is_array( self::$array ) ) {

        }

    }
}

如何通过 Ajax 调用访问 My_Class::$array 属性?

【问题讨论】:

  • 您确定问题出在访问私有属性而不是私有方法上吗?
  • @doublesharp 很好,代码一直执行到 if 语句,我正在检查它是否是一个数组
  • 必须查看整个代码才能了解它为什么会这样,但一般来说,私有方法只能在类中调用时才能访问。由于 PHP 是 PHP,您实际上可以从该类的任何实例访问私有方法,在 Java 等语言中,它将是该对象的特定实例。
  • @doublesharp 用更多代码编辑了我的问题
  • 您没有调用generate_html(),所以$array 为空,而不是数组。

标签: php ajax singleton


【解决方案1】:

即使您声明变量static,它也会在每次请求时被初始化为null - PHP 在这种情况下是“无状态的”,静态变量不会在请求中持续存在。由于您确实希望保留该值,因此您需要使用 $_SESSIONAPCmemcached 之类的东西来保存 $array 的值。

当您的 ajax 调用 save_ajax_form() 时,它会立即调用 validate_data()$array 变量仍然初始化为 null,因为对 generate_html() 的调用发生在不同的请求中,因此检查它是否不是数组将返回 true。

见:Does static variables in php persist across the requests?

【讨论】:

  • 但是我没有进行页面刷新……我如何在我的类构造函数中填充的相同save_ajax_form() 方法中调用另一个private static array?但不是有问题的数组
  • 每个 AJAX 请求都是一个请求,就像您从服务器的角度刷新了页面一样。
  • hmm……好吧……但我很困惑……所以$another_array的状态保持不变,因为在我对save_ajax_form的ajax调用中,__construct也被执行,因此,重新填充?
  • 确切地说,对象构造函数将在每个请求上调用,并将其设置为您在那里的值。如果尝试将其更改为其他内容,它将在第二次请求时返回构造函数中的值。
  • 好的,所以我将不得不再次重新考虑我的逻辑。我试图通过在我的第一个 ajax 调用中填充该 $array 来实现避免另一个数据库查询。谢谢你的课。 :)
【解决方案2】:

显然,您可以将范围声明从 private 更改为 public,或者如果您想保持私有,请添加一个公共访问器:

public function getArray()
{
    self::process_ajax();

    return self::$array;
}

【讨论】:

  • 很抱歉,但这并没有帮助,仍然收到$array === null。 setter 和 getter 都没有帮助
  • 您确定该数组已填充吗?
  • 是的,我在...在generate_html 我正在打印数组self::$array,它就在那里
  • @MikePurcell 问题是$array 在第一个请求中设置,但在第二个请求中重新初始化为空。
  • @doublesharp:没有看到代码,也没有提到第二个请求。我更新了代码,无论第一次还是第 19 次请求,它都会初始化数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2014-11-26
  • 2014-08-31
  • 1970-01-01
  • 2013-02-13
  • 2018-08-18
相关资源
最近更新 更多