Предотвращение того же присвоения Обработчика событий многократно

Код не запускается / что-то похожее на части моего PHP-кода выводятся

Если вы не видите никакого результата из вашего кода PHP и / или видите части своего литерального исходного кода PHP на веб-странице вы можете быть уверены, что ваш PHP на самом деле не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный код PHP-файла. Поскольку PHP-код встроен в теги , браузер попытается интерпретировать их как HTML-теги, и результат может выглядеть несколько смущенным.

Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:

  • веб-сервер, который выполняет ваш скрипт
  • , чтобы установить расширение файла на .php, в противном случае веб-сервер не будет интерпретировать его как таковой *
  • для доступа ваш .php-файл через веб-сервер

* Если вы не переконфигурируете его, все может быть настроено.

Это последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:

file://C:/path/to/my/file.php

Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:

http://localhost/my/file.php

Вы также можете проверить, используете ли вы короткие открытые теги вместо и ваша PHP-конфигурация отключила короткие открытые теги.

Также см. PHP-код не выполняется, вместо этого код отображается на странице

45
задан Mitch Wheat 8 June 2011 в 07:33
поделиться

4 ответа

Baget прав относительно использования явно реализованного события (хотя существует смесь там явной интерфейсной реализации и полного синтаксиса события). Можно, вероятно, сойти с рук это:

private EventHandler foo;

public event EventHandler Foo
{
    add
    {
        // First try to remove the handler, then re-add it
        foo -= value;
        foo += value;
    }
    remove
    {
        foo -= value;
    }
}

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

37
ответ дан Jon Skeet 26 November 2019 в 21:29
поделиться

Я склонен добавлять обработчик событий в пути, это выполняется однажды, например, в конструкторе.

4
ответ дан ChrisW 26 November 2019 в 21:29
поделиться

Каков модификатор доступа 'объекта'?

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

, Если 'объект' может быть сделан частным на содержание класса, можно осуществить проверки, намного более эффективные путем управления присвоением обработчика событий в локальном классе.

, Если 'внутренний' или 'общедоступный' и уникальность требование, пойдите с классом обертки, который скрывает 'объект' и вместо этого представляет метод для присвоения обработчика событий с Вашими проверками позади нее для обеспечения уникальности.

0
ответ дан jro 26 November 2019 в 21:29
поделиться

Можно реализовать собственное устройство хранения данных delgates и проверить на уникальность при добавлении их к событию. См. класс EventOwner2 ниже для примера. Я не знаю, как это делает мудрую производительность, но, чем снова, который является не всегда проблемой.

using System;
using System.Collections.Generic;

namespace EventExperiment
{
    class Program
    {
        static void Main(string[] args)
        {
            IEventOwner e=new EventOwner2();
            Subscriber s=new Subscriber(e);
            e.RaiseSome();
            Console.ReadKey();
        }
    }

    /// <summary>
    /// A consumer class, subscribing twice to the event in it's constructor.
    /// </summary>
    public class Subscriber
    {
        public Subscriber(IEventOwner eventOwner)
        {
            eventOwner.SomeEvent += eventOwner_SomeEvent;
            eventOwner.SomeEvent += eventOwner_SomeEvent;
        }

        void eventOwner_SomeEvent(object sender, EventArgs e)
        {
            Console.WriteLine(DateTimeOffset.Now);
        }

    }

    /// <summary>
    /// This interface is not essensial to this point. it is just added for conveniance.
    /// </summary>
    public interface IEventOwner
    {
        event EventHandler<EventArgs> SomeEvent;
        void RaiseSome();
    }

    /// <summary>
    /// A traditional event. This is raised for each subscription.
    /// </summary>
    public class EventOwner1 : IEventOwner
    {
        public event EventHandler<EventArgs> SomeEvent = delegate { };
        public void RaiseSome()
        {
            SomeEvent(this,new EventArgs());
        }
    }
    /// <summary>
    /// A custom event. This is raised only once for each subscriber.
    /// </summary>
    public class EventOwner2 : IEventOwner
    {
        private readonly List<EventHandler<EventArgs>> handlers=new List<EventHandler<EventArgs>>();
        public event EventHandler<EventArgs> SomeEvent
        {
            add
            {
                lock (handlers)
                    if (handlers!=null&&!handlers.Contains(value))
                    {
                        handlers.Add(value);
                    }
            }
            remove
            {
                handlers.Remove(value);
            }
        }
        public void RaiseSome()
        {
            EventArgs args=new EventArgs();
            lock(handlers)
            foreach (EventHandler<EventArgs> handler in handlers)
            {
                handler(this,args);
            }
        }
    }
}
2
ответ дан Øyvind Skaar 26 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

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