Переменные класса не остаются установленными (PHP) - PullRequest
1 голос
/ 28 марта 2012

Хорошо, я не совсем уверен на 100%, что здесь происходит, но я думаю, что это связано с тем, что я пытаюсь включить класс с помощью функции php "include ($ file)".

импорт функции выглядит следующим образом:

<?php
function import($file) {
    global $imported; $imported = true;
    $home_dir = "C:/xampp/htdocs/includes/";
    if (file_exists($home_dir.$file.".php")) {
        include_once($home_dir.$file.".php");
        }
    $imported = false;
    }
?>

Все, что я делаю, это вызываю следующий php в моем файле index.php:

<?php
import("php.buffer");

$out = new StringBuffer;
$out->write("test?");
echo "'".($out->get())."' &lt;- Buffer String Should Be Here";
?>

php.buffer.phpфайл выглядит так:

<?php
class StringBuffer {
    public $buffer = "";

    public function set($string) {
        if (!isset($buffer)) { $buffer = ""; }
        $buffer = $string;
        }

    public function get() {
        if (!isset($buffer)) { $buffer = ""; }
        return $buffer;
        }

    public function write($string) {
        if (!isset($buffer)) { $buffer = ""; }
        $buffer = $buffer.chr(strlen($string)).$string;
        }

    public function read() {
        if (!isset($buffer)) { $buffer = ""; }
        $return = "";
        $str_len = substr($buffer,0,1); $buffer = substr($buffer,1,strlen($buffer)-1);
        $return = substr($buffer,0,$str_len); $buffer = substr($buffer,$str_len,strlen($buffer)-$str_len);

        return $return;
        }

    public function clear() {
        $buffer = "";
        }

    public function flushall() {
        echo $buffer;
        $this->clear();
        }

    public function close() {
        return new NoMethods();
        }
    }
?>

Я не получаю никаких ошибок при создании нового класса StringBuffer, поэтому я знаю, что он действительно включает мои файлы.

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Здесь происходит то, что внутри ваших методов класса вместо доступа к свойствам ($this->buffer) вы получаете и устанавливаете локальные переменные ($buffer), чтобы изменения не «прилипали».

Этот код может также использовать некоторую очистку. Там есть много лишних вещей, например:

public function set($string) {
    // isset will never return false, so this if will never execute
    // even if it did, what's the purpose of setting the buffer when you
    // are going to overwrite it one line of code later?
    if (!isset($this->buffer)) { $this->buffer = ""; }
    $this->buffer = $string;
}
1 голос
/ 28 марта 2012

Я думаю, что ваш класс должен быть

class StringBuffer {
    private $buffer = "";

    public function get() {
        if (!isset($this->$buffer)) { $this->$buffer = ""; }
        return $this->$buffer;
        }

    public function write($string) {
        if (!isset($this->$buffer)) { $this->$buffer = ""; }
        $this->$buffer = $this->$buffer.chr(strlen($string)).$string;
        }
}

, поэтому вы устанавливаете переменную класса, а с помощью своего кода вы просто устанавливаете переменные внутри методов

...