Если вы не видите никакого результата из вашего кода PHP и / или видите части своего литерального исходного кода PHP на веб-странице вы можете быть уверены, что ваш PHP на самом деле не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный код PHP-файла. Поскольку PHP-код встроен в теги , браузер попытается интерпретировать их как HTML-теги, и результат может выглядеть несколько смущенным.
Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:
* Если вы не переконфигурируете его, все может быть настроено.
Это последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:
file://C:/path/to/my/file.php
Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:
http://localhost/my/file.php
Вы также можете проверить, используете ли вы короткие открытые теги вместо
и ваша PHP-конфигурация отключила короткие открытые теги.
Также см. PHP-код не выполняется, вместо этого код отображается на странице
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;
}
}
, Который может иметь некоторые нечетные пограничные случаи, если Вы когда-нибудь добавляете или удаляете многоадресных делегатов, но это маловероятно. Этому также нужна тщательная документация, поскольку это не способ, которым обычно работают события.
Я склонен добавлять обработчик событий в пути, это выполняется однажды, например, в конструкторе.
Каков модификатор доступа 'объекта'?
, Если это является частным, только необходимо взволновать по поводу содержания параметра объекта обработчик событий. Если это является внутренним, только необходимо волноваться о содержании блока, устанавливающего обработчик событий. Если это общедоступно, то это является широко открытым.
, Если 'объект' может быть сделан частным на содержание класса, можно осуществить проверки, намного более эффективные путем управления присвоением обработчика событий в локальном классе.
, Если 'внутренний' или 'общедоступный' и уникальность требование, пойдите с классом обертки, который скрывает 'объект' и вместо этого представляет метод для присвоения обработчика событий с Вашими проверками позади нее для обеспечения уникальности.
Можно реализовать собственное устройство хранения данных 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);
}
}
}
}