Что ключевое слово Вызова делает в VB6?

Почему это не работает?

blockquote>

по умолчанию сеансы сохраняются в локальных файлах на сервере, расположение которых указано в php.ini session.save_path, например [ 114], если app.example.com и help.app.example.com работают на 2 разных серверах с их собственной файловой системой, или даже если они работают на одной и той же файловой системе, но имеют разные директивы session.save_path в php.ini, они не будет делить то же самое $ _SESSION.

если вы хотите, чтобы 2 разных сервера использовали один и тот же $ _SESSION, возможные решения включают создание базы данных общего хранилища сеансов с session_set_save_handler() (как вспоминается MongoDB или MySQL) или создание сетевой файловой системы и установки [ 117] в php.ini, но оба эти метода могут повлечь за собой значительное снижение производительности.

... поскольку файл cookie используется в обоих доменах, session_id() будет возвращать одно и то же значение с обеих сторон, которое можно использовать в качестве идентификатора для базы данных сеансов, взгляните на http: // php.net/manual/en/class.sessionhandlerinterface.php

(я бы написал пример класса, если бы у меня было больше времени, но у меня нет времени) strike>

переключиться на хранилище сеансов с поддержкой sql-db (например, MariaDB, MySQL или PostgreSQL), например: schema:

CREATE TABLE sessions (
  id VARCHAR(255) ,
  atime BIGINT ,
  data BLOB
)

Реализация SessionHandlerInterface:

class MySqlSessionHandler implements SessionHandlerInterface
{
    protected $db;
    public function __construct(string $dsn, string $username, string $password)
    {
        $this->db = new PDO($dsn, $username, $password, array(
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ));
    }
    protected function a(string $id) : bool
    {
        $ret = $this->db->query("UPDATE sessions SET atime = " . (time()) . " WHERE id = " . $this->db->quote($id));
        return ($ret->rowCount() > 0);
    }
    public function close() : bool
    {
        // TODO: implement locking/race-condition-free session handling?
        return true;
    }
    public function destroy(string $id) : bool
    {
        $this->db->query("DELETE FROM sessions WHERE id = " . $db->quote($id));
        return true;
    }
    public function gc(int $maxlifetime) : int
    {
        $this->db->query("DELETE FROM sessions WHERE atime < " . (time() - $maxlifetime));
        return 1; // ??? not sure what this return int is supposed to contain, docs doesn't say either
    }
    public function open(string $save_path, string $session_name) : bool
    {
        if (!$this->a($session_name)) {
            $stm = $this->db->prepare("INSERT INTO sessions (id,atime,data) VALUES(?,?,?);");
            $stm->execute(array($session_name, time(), serialize(null)));
        }
        return true;
    }
    public function read(string $session_id) : string
    {
        if (!$this->a($session_id)) {
            throw new \InvalidArgumentException("supplied session id does not exist.");
        }
        return $this->db->query("SELECT data FROM sessions WHERE id = " . $this->db->quote($session_id))->fetch(PDO::FETCH_ASSOC)['data'];
    }
    public function write(string $session_id, string $session_data) : bool
    {
        // optimization note: this function can be optimized to do everything in a single query, instead of using a() (which also use a query)
        if (!$this->a($session_id)) {
            throw new \InvalidArgumentException("supplied session id does not exist.");
        }
        $stm = $this->db->prepare("UPDATE sessions SET data = ? WHERE id = ?");
        $stm->execute(array($session_data, $session_id));
        return true;
    }
}
[ 1119] использование:

// for DSN documentation, check http://php.net/manual/en/ref.pdo-mysql.connection.php
$handler = new MySqlSessionHandler ('mysql:host=mydb.foo.com;dbname=sessions;charset=utf8mb4','MySqlUsername','MySqlPassword');
session_set_save_handler($handler, true);
session_start();
  • теперь они обязательно должны делиться сессиями ..
  • предупреждение: не проверено на момент написания, но это должно работать в теории.
33
задан dance2die 22 April 2009 в 18:53
поделиться

5 ответов

Из MSDN:

Вы не обязаны использовать ключевое слово Вызова при вызове процедуры. Однако, если Вы используете ключевое слово Вызова для вызова процедуры, которая требует, чтобы аргументы, argumentlist был включен в круглые скобки. При исключении ключевого слова Вызова также необходимо опустить круглые скобки вокруг argumentlist. При использовании или синтаксиса Вызова для вызывания какой-либо внутренней или пользовательской функции, возвращаемое значение функции отбрасывается.

Например:

Sub Proc1()
    Debug.Print "Hello World"
End Sub

Sub Proc2(text As String)
    Debug.Print "Hello " & text
End Sub

В непосредственном окне, если Вы входите

Proc1

затем "Привет Мировая" печать. Если Вы входите

Call Proc1

затем "Привет Мировая" печать. Если Вы входите

Proc2 "World"

затем "Привет Мировая" печать. Если Вы входите

Call Proc2 "World" 

Вы получаете ошибку компиляции. Необходимо было бы войти

Call Proc2("World")
37
ответ дан 27 November 2019 в 18:17
поделиться

Нет никакого различия.

2
ответ дан 27 November 2019 в 18:17
поделиться

Вызов не делает ничего специального кроме вызова метод. Это - подвешивание законченного с былых времен Основных, когда все строки должны были запуститься с ключевого слова. "Позволенный" другое из этих ключевых слов, которое всегда помещалось перед присвоением, но больше не требуется.

Method1 и Method2 делают ту же самую вещь.

11
ответ дан 27 November 2019 в 18:17
поделиться

Вот сообщение, которое описывает, когда необходимо использовать вызов по сравнению с не использованием его и когда к круглым скобкам вокруг параметров.

Можно также читать больше о вызове из MSDN. По существу основное различие - то, что при использовании "вызова к вызову" функция, Вы не можете получить доступ к возвращаемому значению.

2
ответ дан 27 November 2019 в 18:17
поделиться

Я обнаружил существенное отличие ключевого слова call от функций, имеющих аргументы ByRef (я нашел это в редакторе MS-Access VBA). Если вы вызываете функцию без ключевого слова Call, параметры ByRef не будут установлены для вызываемого объекта. Например:

Private Function Test(Optional ByRef refArg As String) As Boolean    
    refArg = "Test"
    Test = True
End Function

Если вы вызываете функцию без ключевого слова Call , например

Dim a As String
Test(a)

, то будет пустой строкой, после того, как вызов вернет

Если вы вызовете функцию с Вызов ключевое слово, например

Dim a As String
Call Test(a)

a , будет содержать строку Test

Подробное объяснение приведено по следующей ссылке: http://blogs.msdn.com/b/ericlippert/archive/2003/09/15/52996.aspx

5
ответ дан 27 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: