Я могу использовать методы класса, не инстанцируя этого класса?

Поскольку массивы могут содержать смешанные значения, это невозможно.

Для этой цели вам необходимо использовать объекты / класс.

Вы можете создать класс, который будет управлять собственным массивом списка (частный / защищенный атрибут) и запретить добавлять другие значения в качестве рабочий стол для этой проблемы, если это действительно необходимо.

Однако ни один ответственный программист никогда не сломает намеченный шаблон, особенно если вы его прокомментируете правильно.

Экзапланирование:

Например, вы можете создать любой массив:

$myArray = array();

и добавить number:

$myArray[] = 1;

a строка:

$myArray[] = "abc123";

и объект

$myArray[] = new MyClass("some parameter", "and one more");

Также не забывайте, что вы можете иметь простой массив, многомерный штабелированный массив, а также ассоциативные массивы, которые также могут иметь смешанные шаблоны.

Его довольно трудно, пока невозможно найти парсер / нотацию, чтобы все версии работали с выражением, которое заставляет формат для массив, я думаю.

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

Из-за смешанного контента, функции которого мы не хотим пропустить в PHP 7, невозможно набрать точное совпадение массива, как вы можете что-то вставить.

23
задан Roman 6 March 2010 в 11:42
поделиться

10 ответов

Если методы статические, да.

Но вы не сможете получить доступ к нестатичным членам.

12
ответ дан µBio 29 November 2019 в 01:16
поделиться

У меня есть класс с несколькими методами, и среди этих методов нет конструктора.

Если вы не определите конструктор явным образом, вы получите конструктор по умолчанию, предоставленный компилятором. Так что, если эти методы не являются статичными, попробуйте это:

NameOfClass x = new NameOfClass();
x.doMethod(x1,x2,...,xn);
2
ответ дан Mark Byers 29 November 2019 в 01:16
поделиться

Это были бы статические методы.

1
ответ дан Tony The Lion 29 November 2019 в 01:16
поделиться

Поскольку qre является статическим методом и не имеет доступа к экземплярам включающего класса, вам сначала нужно создать экземпляр, а затем получить к нему доступ. Например:

public class Foo {
   private int bar;

   public static void qre() {
      Foo foo = new Foo();
      foo.bar = 5;
      System.out.println("next bar: " + (++5));
   }
}
0
ответ дан Boris Pavlović 29 November 2019 в 01:16
поделиться

Это называется статическими переменными и статическими методами . Просто попробуйте и убедитесь, что он компилируется.

27
ответ дан 29 November 2019 в 01:16
поделиться

Как многие отмечали: это возможно только в том случае, если метод является статическим. Может быть, уместно немного предыстории ООП: метод всегда должен принадлежать классу. Так в чем же смысл вызова метода без экземпляра класса? В идеальном мире объектно-ориентированного программирования не должно быть никаких причин для этого. Во многих случаях использования, связанных со статическими методами, говорится о присвоении вашему классу какой-либо идентичности. Хотя это совершенно разумно в мире программирования, это не очень убедительно, когда дело доходит до объектно-ориентированного дизайна.

Поскольку мы программируем в несовершенном мире, часто есть вариант использования «бесплатной функции» (например, способ реализации sort () в Java или C ++). Поскольку в Java нет прямой поддержки свободных функций, классы с использованием только статических «методов» для выражения этой семантики с дополнительным преимуществом оболочки класса, обеспечивающей «пространство имен». Что вы думаете об этом обходном пути, и если вы видите его как недостаток в языковом дизайне, это вопрос IMO.

6
ответ дан 29 November 2019 в 01:16
поделиться

На большинстве языков это возможно, только если метод статичен. А статические методы могут изменять только статические переменные.

2
ответ дан 29 November 2019 в 01:16
поделиться

У меня есть класс с несколькими методами , и среди этих методов нет конструктора.

Вы имеете в виду, что у вас есть что-то вроде:

public class X
{
    public void foo()
    {
    }
}

или вы имеете в виду, что у вас есть что-то вроде:

public class X
{
    private X()
    {
    }

    public void foo()
    {
    }
}

Если это первый способ, то да, есть конструктор, и он будет выглядеть так:

public X()
{
    super();
}

если это второй способ, то, вероятно, существует такой метод, как:

public static X createInstance()
{
    return (new X());
}

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

1
ответ дан 29 November 2019 в 01:16
поделиться

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

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

0
ответ дан 29 November 2019 в 01:16
поделиться

Метод класса работает в контексте экземпляра; он имеет доступ к переменным-членам экземпляра. Вы понимаете это, потому что спрашиваете, что произойдет, если метод получит доступ к одной из этих переменных.

Вы можете понять, почему это не работает, задав себе вопрос: «Где данные?» Если у вас нет экземпляра, где находится переменная экземпляра? Где данные? И ответ в том, что ему нет места, и поэтому он не работает.

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

2
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

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