Происходит при попытке вызова не- статический метод для класса, поскольку он был статичным, и вы также имеете флаг E_STRICT
в настройках error_reporting()
.
Пример:
class HTML {
public function br() {
echo '
';
}
}
HTML::br()
или $html::br()
Вы действительно можете избежать этой ошибки, не добавляя E_STRICT
к error_reporting()
, например
error_reporting(E_ALL & ~E_STRICT);
, поскольку, как и для PHP 5.4.0 и выше, E_STRICT
включен в E_ALL
[ ref ]. Но это не рекомендуется. Решение состоит в том, чтобы определить вашу предполагаемую статическую функцию как фактическую static
:
public static function br() {
echo '
';
}
или вызвать функцию условно:
$html = new HTML();
$html->br();
Похожие вопросы:
Нет никакого встроенного способа получить это представление в.Net Платформе. А именно, потому что нет никакого способа получить его корректный. Существует большое количество конструкций, которые не являются представимыми в синтаксисе стиля C#. Например, "<> нечто" является допустимым именем типа в IL, но не может быть представлено в C#.
Однако при поиске довольно хорошего решения это может быть рука, реализованная справедливо быстро. Ниже решения будет работать на большинство ситуаций. Это не обработает
Пример:
public static string GetFriendlyTypeName(Type type) {
if (type.IsGenericParameter)
{
return type.Name;
}
if (!type.IsGenericType)
{
return type.FullName;
}
var builder = new System.Text.StringBuilder();
var name = type.Name;
var index = name.IndexOf("`");
builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index));
builder.Append('<');
var first = true;
foreach (var arg in type.GetGenericArguments())
{
if (!first)
{
builder.Append(',');
}
builder.Append(GetFriendlyTypeName(arg));
first = false;
}
builder.Append('>');
return builder.ToString();
}
Этим вечером я играл немного с дополнительными методами, и я пытался найти ответ для Вашего вопроса. Вот результат: это - код без гарантий.;-)
internal static class TypeHelper
{
private const char genericSpecialChar = '`';
private const string genericSeparator = ", ";
public static string GetCleanName(this Type t)
{
string name = t.Name;
if (t.IsGenericType)
{
name = name.Remove(name.IndexOf(genericSpecialChar));
}
return name;
}
public static string GetCodeDefinition(this Type t)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}.{1}", t.Namespace, t.GetCleanName());
if (t.IsGenericType)
{
var names = from ga in t.GetGenericArguments()
select GetCodeDefinition(ga);
sb.Append("<");
sb.Append(string.Join(genericSeparator, names.ToArray()));
sb.Append(">");
}
return sb.ToString();
}
}
class Program
{
static void Main(string[] args)
{
object[] testCases = {
new Dictionary<string, DateTime>(),
new List<int>(),
new List<List<int>>(),
0
};
Type t = testCases[0].GetType();
string text = t.GetCodeDefinition();
Console.WriteLine(text);
}
}
string text = dictionary.ToString();
обеспечивает почти, что Вы просите:
System.Collections.Generic.Dictionary`2[System.String,System.DateTime]
Я не думаю, что.NET имеет что-либо встроенное, которое сделало бы это, таким образом, необходимо будет сделать это сами. Я думаю, что отражательные классы предоставляют достаточно информации для восстановления имени типа в этой форме.
Я полагаю, что можно передать
Система. Строка, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
в Type.Parse()
. Это - полностью определенное имя типа, я думаю.